Laravel 不强制转换字符串主键

标签 laravel eloquent

我有一个带有字符串主键的 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/

相关文章:

Laravel hasMany通过多态关系

php - 无法通过 Mandrill 发送 BCC 电子邮件(通过 Laravel)

Laravel验证对象数组

php - Laravel Eloquent paginate 如何查询分页参数?

Laravel:preg_replace():参数不匹配,模式是字符串,而替换是数组

mysql - join和group By查询如何添加分页功能?

php - 使用 vue.js 在 laravel 中使用消息重定向

php - 如何连接 laravel 集合的值

php - Laravel 5.4 - 如何设置 PDO 获取模式?

php - 使用 Slim Framework 和 Laravel 的 Eloquent ORM 进行分页