laravel - Laravel 不强制转换字符串主键
问题描述
我有一个带有字符串主键的雄辩模型:
protected $keyType = 'string';
如果我运行这个:
PaymentProvider::find('stripe');
PaymentProvider::find(0);
预期输出:
- id = 'stripe' 的行
- 无效的
实际输出:
- 条纹行
- Stripe 行(或表中的第一行)
这似乎是 MySQL 的一个怪癖,其中 id = 0 当主键是字符串时返回所有行。
Route Model Binding 正确处理了这个问题,生成的查询正在搜索字符串而不是整数:
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。如果您希望使用非递增或非数字主键,您必须将模型上的公共 $incrementing 属性设置为 false:
public $incrementing = false;
protected $keyType = 'string';
检查文档。
推荐阅读
- java - 如何压缩和调整位图大小?
- php - 使用 passthru 跳过代理的 MP4 文件
- asp.net - neo4client 合并并不总是有效
- android - java.lang.RuntimeException:布局不能为空
- javascript - XMLHTTP 请求:即使在节流限制下也有太多请求
- amp-html - 修复 AMP 样式表错误
- exception - 在 Perl 6 中,如何打印可能在编译时抛出的异常类型?
- google-project-tango - 探戈项目 / arcore 区域映射
- python - Python / Dash:图形的单个子图中的多个图形
- javascript - 删除所有活动类然后切换类 - javascript