首页 > 解决方案 > Laravel 不强制转换字符串主键

问题描述

我有一个带有字符串主键的雄辩模型:

protected $keyType = 'string';

如果我运行这个:

PaymentProvider::find('stripe');
PaymentProvider::find(0);

预期输出:

实际输出:

这似乎是 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

这似乎已经在框架的其他地方考虑过,所以我不确定这是一个真正的错误还是设计使然。

为什么不将字符串主键转换为字符串?

标签: laraveleloquent

解决方案


Eloquent 假设主键是一个递增的整数值,这意味着默认情况下主键会自动转换为 int。如果您希望使用非递增或非数字主键,您必须将模型上的公共 $incrementing 属性设置为 false:

public $incrementing = false;
protected $keyType = 'string';

检查文档


推荐阅读