题 Laravel 5.2 - 使用字符串作为Eloquent Table的自定义主键变为0


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

<?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';
}

我的DB就像这样 -

enter image description here

但如果我这样做 -

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。

有人可以帮忙吗?


41
2018-01-03 22:48


起源




答案:


这是 在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;
}

102
2018-01-11 06:21



有原因吗? $incrementing 字段是公开的而不是受保护的? - Mubashar Abbas
@MubasharAbbas你的模型必须与Eloquent相匹配。现在,为什么Eloquent会这样做 $incrementing 公众和 $primaryKey 保护?这很随意。我正在猜测 $incrementing 在早期版本的Eloquent(它现在没有)中没有getter或setter方法,他们只是不想在添加它们后进行重大更改 - andrewtweber
如果您没有主键(或Eloquent不支持的复合键),并且您尝试使用主键重复此类表 chunk,您可能会遇到以下错误: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'example.' in 'order clause'。在这种情况下,您需要明确定义 orderBy 声明,Eloquent尝试使用主键附加到您的查询。 - antongorodezkiy


在模型集上 $incrementing 为假

public $incrementing = false;

这将阻止它认为它是一个自动增量字段。

Laravel Docs - 雄辩 - 定义模型


17
2018-01-03 23:09





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

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

    public $incrementing = false;
}

有关详细信息,请参阅 Primary Keys 中的部分 关于Eloquent的文档


3
2018-01-03 23:18



它需要 public $incrementing 匹配父类。 - andrewtweber


继续使用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);

0
2018-04-22 20:36