Laravel 5.2-使用字符串作为口才表的自定义主键变为0


81

我正在尝试使用电子邮件作为表的主键,所以雄辩的代码是-

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class UserVerification extends Model
{
    protected $table = 'user_verification';
    protected $fillable =   [
                                'email',
                                'verification_token'
                            ];
    //$timestamps = false;
    protected $primaryKey = 'verification_token';
}

我的数据库就是这样的

在此处输入图片说明

但是如果我这样做-

UserVerification::where('verification_token', $token)->first();

我得到这个-

{
  "email": "sdfsdf@sdfsdf.sdf",
  "verification_token": 0,
  "created_at": "2016-01-03 22:27:44",
  "updated_at": "2016-01-03 22:27:44"
}

因此,验证令牌/主键变为0。

谁能帮忙吗?

Answers:


180

它已于2015年12月29日添加到升级文档中,因此,如果您之前进行了升级,则可能会错过它。

从模型中获取任何属性时,它会检查该列是否应强制转换为整数,字符串等。

默认情况下,对于自动递增表,此方法假定ID为整数:

https://github.com/laravel/framework/blob/5.2/src/Illuminate/Database/Eloquent/Model.php#L2790

所以解决方案是:

class UserVerification extends Model
{
    protected $primaryKey = 'your_key_name'; // or null

    public $incrementing = false;

    // In Laravel 6.0+ make sure to also set $keyType
    protected $keyType = 'string';
}

3
是否有理由将$incrementing字段公开而不是受保护?
Mubashar Abbas

5
@MubasharAbbas好,您的模型必须与Eloquent匹配。现在,为何Eloquent会$incrementing公开并$primaryKey受到保护?这是很随意的。我猜想$incrementing
Eloquent的

1
如果您没有主键(或Eloquent不支持的复合键),并且您尝试使用来迭代此类表chunk,则可能会遇到以下错误:SQLSTATE[42S22]: Column not found: 1054 Unknown column 'example.' in 'order clause'。在这种情况下,您需要显式定义orderBy语句,Eloquent试图使用主键将其附加到查询中。
antongorodezkiy

不幸的是,这些是Laravel阻止我全心全意地做的事情。检测列类型(像处理许多其他列一样)是否更有意义?
阿米莉亚·萨拉小姐


7

您需要在模型上设置两个属性。第一个$primaryKey告诉模型期望主键输入的列。第二个$incrementing它知道主键不是线性自动递增值。

class MyModel extends Model
{
    protected $primaryKey = 'my_column';

    public $incrementing = false;
}

有关更多信息,请参阅Eloquent文档中Primary Keys部分。


1
它必须public $incrementing与父类匹配。
andrewtweber'1

2

我正在使用Postman测试我的Laravel API。

我收到指出的错误

“ SQLSTATE [42S22]:找不到列:1054未知列”,因为Laravel试图自动创建两个列“ created_at”和“ updated_at”。

我必须输入public $timestamps = false;模型。然后,我再次用Postman进行测试,发现"id" = 0在数据库中正在创建一个变量。

我终于不得不添加public $incrementing false;修复我的API。


2

继续使用ID


<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class UserVerification extends Model
{
    protected $table = 'user_verification';
    protected $fillable =   [
                            'id',
                            'email',
                            'verification_token'
                            ];
    //$timestamps = false;
    protected $primaryKey = 'verification_token';
}

并获取电子邮件:

$usr = User::find($id);
$token = $usr->verification_token;
$email = UserVerification::find($token);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.