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

Abr*_*hin 60 php mysql laravel eloquent laravel-5

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

<?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';
}
Run Code Online (Sandbox Code Playgroud)

我的DB就像这样 -

在此输入图像描述

但如果我这样做 -

UserVerification::where('verification_token', $token)->first();
Run Code Online (Sandbox Code Playgroud)

我得到这个 -

{
  "email": "sdfsdf@sdfsdf.sdf",
  "verification_token": 0,
  "created_at": "2016-01-03 22:27:44",
  "updated_at": "2016-01-03 22:27:44"
}
Run Code Online (Sandbox Code Playgroud)

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

有人可以帮忙吗?

and*_*ber 139

这已添加到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;
}
Run Code Online (Sandbox Code Playgroud)

  • @MubasharAbbas你的模型必须与Eloquent相匹配.现在,为什么Eloquent会使`$ incrementing` public和`$ primaryKey`受到保护?这很随意.我猜测`$ incrementing`在早期版本的Eloquent中没有getter或setter方法(现在确实如此),他们只是不想在添加它们之后进行重大更改 (4认同)
  • 有没有理由为`$ incrementing`字段是公共的而不是受保护的? (3认同)
  • 如果您没有主键(或 Eloquent 不支持的复合键),并且您尝试使用 `chunk` 迭代此类表,则可能会遇到以下错误:`SQLSTATE[42S22]: Column not found: 1054 未知列“示例”。在“订单条款”中。在这种情况下,您需要明确定义 `orderBy` 语句,Eloquent 试图将其附加到您的查询的主键中。 (2认同)

lag*_*box 22

在模型设置$incrementing为false

public $incrementing = false;
Run Code Online (Sandbox Code Playgroud)

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

Laravel Docs - 雄辩 - 定义模型


Wad*_*der 7

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

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

    public $incrementing = false;
}
Run Code Online (Sandbox Code Playgroud)

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