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

2022-08-30 07:30:16

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

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

而我的数据库是这样的——

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。

任何人都可以帮忙吗?


答案 1

这是在 2015 年 12 月 29 日添加到升级文档中的,因此,如果您之前升级过,则可能会错过它。

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

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

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

所以解决方案是:

class UserVerification extends Model
{
    // if your key name is not 'id'
    // you can also set this to null if you don't have a primary key
    protected $primaryKey = 'your_key_name';

    public $incrementing = false;

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

答案 2

在模型设置为 false 时$incrementing

public $incrementing = false;

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

Laravel Docs - Eloquent - 定义模型


推荐