为什么 Eloquent(在 Laravel 中)将我的 varchar uuid 主键转换为整数导致错误?
Why does Eloquent (in Laravel) cast my varchar uuid primary key to an integer resulting in errors?
在我昨晚的 之后,我睡了个好觉 "discovered" 发生这种情况是由于自动转换/类型转换或其他原因。
求和:
- 模型使用
uuid
作为主键
- 他们通过
trigger
从 mySQL 插入
- 为了获取数据库运行时生成的 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;
$address = $address->fresh();
var_dump($address); exit;
var_dump($address->uuid); exit;//result (wow): int(0)
}
为了让它工作,我必须手动覆盖模型中主键的转换类型。
protected $casts = [
'id' => 'string'
];
给后来来这里的人。您可以使用以下字符串类型覆盖模型中的 $keyType
变量:
protected $keyType = 'string';
我查看了 \Illuminate\Database\Eloquent\Model
class,发现最有效的方法是在您的模型中设置 $incrementing = false
。
在我的测试中,创建和检索模型都按预期工作。
这是带有 PHP 文档评论的片段。
/**
* Indicates if the IDs are auto-incrementing.
*
* @var bool
*/
public $incrementing = false;
在我昨晚的
求和:
- 模型使用
uuid
作为主键 - 他们通过
trigger
从 mySQL 插入
- 为了获取数据库运行时生成的 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;
$address = $address->fresh();
var_dump($address); exit;
var_dump($address->uuid); exit;//result (wow): int(0)
}
为了让它工作,我必须手动覆盖模型中主键的转换类型。
protected $casts = [
'id' => 'string'
];
给后来来这里的人。您可以使用以下字符串类型覆盖模型中的 $keyType
变量:
protected $keyType = 'string';
我查看了 \Illuminate\Database\Eloquent\Model
class,发现最有效的方法是在您的模型中设置 $incrementing = false
。
在我的测试中,创建和检索模型都按预期工作。
这是带有 PHP 文档评论的片段。
/**
* Indicates if the IDs are auto-incrementing.
*
* @var bool
*/
public $incrementing = false;