我有一个带有字符串主键的 Eloquent 模型:
protected $keyType = 'string';
如果我运行这个:
PaymentProvider::find('stripe');
PaymentProvider::find(0);
预期输出:
- id = 'stripe' 的行
- 空
实际输出:
- 条纹行
- Stripe 行(或表格中的第一行)
这似乎是 MySQL 的一个怪癖,当主键是字符串时,id = 0 返回所有行。
路由模型绑定(bind)正确处理这个问题,生成的查询正在搜索字符串而不是整数:
1 => array:3 [▼
"query" => "select * from `payment_providers` where `id` = ? and `payment_providers`.`deleted_at` is null limit 1"
"bindings" => array:1 [▼
0 => "0"
]
"time" => 0.32
]
似乎主元关系也被设计为转换字符串主键: https://github.com/laravel/framework/blob/7.x/src/Illuminate/Database/Eloquent/Relations/Concerns/InteractsWithPivotTable.php#L654:L667
这似乎已经在框架的其他地方考虑过,所以我不确定这是否是真正的错误或设计使然。
为什么字符串主键不转换为字符串?
最佳答案
Eloquent 假设主键是一个递增的整数值,这意味着默认情况下主键会自动转换为 int。如果您希望使用非递增或非数字主键,则必须将模型上的公共(public) $incrementing 属性设置为 false:
public $incrementing = false;
protected $keyType = 'string';
检查docs .
关于Laravel 不强制转换字符串主键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62379336/