【问题标题】:Why does Eloquent (in Laravel) cast my varchar uuid primary key to an integer resulting in errors?为什么 Eloquent(在 Laravel 中)将我的 varchar uuid 主键转换为整数导致错误?
【发布时间】:2020-09-18 20:15:49
【问题描述】:

在我昨晚的question 之后,我睡得很好,并“发现”这是由于自动转换/类型转换或其他原因造成的。

总结:

  • 模型使用uuid作为主键
  • 他们在从 mySQL 插入时通过 trigger 获取它们
  • 为了得到数据库运行时生成的uuid,我调用$model_object->fresh();fresh()
  • 这在获取整个对象时有效,但在仅选择一个属性时无效

型号

<?php namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Address extends Model {

    protected $table = 'Addresses';
    protected $fillable = ['uuid', 'zipCode', 'houseNumber'];
    protected $primaryKey = 'uuid';
    //public $incrementing = false;
}

控制器(搞砸的地方)

public function store(Request $request) {
    $input = $request->all();
    $address = Address::create($input);
    var_dump($address); exit;

//result (as expected)

    $address = $address->fresh();
    var_dump($address); exit;

//result (as expected)

var_dump($address->uuid); exit;//result (wow): int(0)
}

【问题讨论】:

  • 您确定该字段在数据库中有值吗?在您的第一个转储中它是空的。
  • @aynber 是的,我确定,请参考 uuid 上方的 var_dump() 1 行。如果 uuid 不以 0 开头,则返回该整数(例如 2),因此它始终返回在 uuid 中遇到的第一个 int
  • 可能是this is the answer?我认为你可以覆盖它。
  • @alariva 很好的调用,但是在调用fresh() 之后它现在返回null 而不是预期的对象,就像将public $incrementing 设置为false 时一样。我认为这是fresh() 函数中的一个错误。
  • 是的,我的意思是 处理 模型键的 uuid 以避免该类型转换问题。然而,从这一点开始,我认为它需要更多的研究:)

标签: php laravel-5 eloquent uuid type-conversion


【解决方案1】:

为了使其工作,我必须手动覆盖模型中主键的转换类型。

protected $casts = [
  'id' => 'string'
];

【讨论】:

    【解决方案2】:

    对于以后来这里的人。您可以使用字符串类型覆盖模型中的$keyType 变量:

    protected $keyType = 'string';
    

    【讨论】:

      【解决方案3】:

      我查看了\Illuminate\Database\Eloquent\Model 类,发现最有效的方法是在你的模型中设置$incrementing = false

      在我的测试中,创建和检索模型都按预期工作。

      这是 PHP 文档 cmets 的片段。

          /**
           * Indicates if the IDs are auto-incrementing.
           *
           * @var bool
           */
          public $incrementing = false;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-03
        • 1970-01-01
        • 2021-11-12
        • 1970-01-01
        • 2014-08-16
        • 2012-11-29
        相关资源
        最近更新 更多