我相信当外键是包含零填充数字的字符串时,我遇到了Laravel 5.3如何处理预先加载的错误。
我有两个模型(使用mysql后端),School
和Student
。 id
中的School
字段是一个字符串,包含由州分配的5位数字,包括前导零。 Student
BelongsTo
School
,并且包含school_id
字段,其定义与id
中的School
字段相同。我做了一些测试,我发现当我致电Student::with('school')
时,只要School
中的school_id
免费,我就会获得预期的Student
模型前导零,但它不返回带有前导零的School
值的school_id
模型。
我已经使用新创建的School
记录进行了直接测试,并且两个数据库表中的前导零正确存储了值,当我尝试直接查询表时,前导零工作正常,但是只要with()
进入等式,事情就会破裂。我试图通过其他方式重现失败,甚至手动构建whereIn()
调用镜像with()
构造的查询的语法,但其他所有内容都正确返回预期的记录。
在将Laravel升级阶梯从4.1升级到5.3之前,此代码工作正常,因此我想知道可能发生了什么变化。我已经走进了the GitHub repository for BelongsTo,并且没有一个参数处理似乎剥离了前导零,所以我真的不知道为什么with()
打破了这样。
那么,是否有人可以分享任何见解?我很难过,而且不想在with()
左右工程。我还预先说明我无法从id
字段中删除前导零,它不是一个选项,它们实际上必须存储,而不仅仅是显示为ZEROFILL。
更新:我附上了一个示例,该示例确定school_id
中存储的Student
与School
分开使用时可以成功连接到相应的with()
语句:
$interventions = Intervention::with('school')->where('id','=',780)->get();
$schools = School::whereIn('id',$interventions->pluck('school_id')->all())->get();
throw new \Exception(print_r($interventions,true).'|'.print_r($schools,true));
以下是\ Exception :(简称)编辑的结果:
Exception in AdminController.php line 273:
Illuminate\Database\Eloquent\Collection Object
(
[items:protected] => Array
(
[0] => App\Models\Student Object
(
[attributes:protected] => Array
(
[id] => 780
[school_id] => 01234
)
[relations:protected] => Array
(
[school] =>
)
)
)
)
Illuminate\Database\Eloquent\Collection Object
(
[items:protected] => Array
(
[0] => App\Models\School Object
(
[attributes:protected] => Array
(
[id] => 01234
[school] => Test1
[district_id] => 81000
[inactive] => 0
[see] => 0
)
)
)
)
因此,虽然Student::with('school')
无法提取相应的School
,但将相同的Student->school_id
值提供给School::whereIn()
会成功。我仍然感到神秘。
答案 0 :(得分:2)
您没有展示模型类,但我猜您在public $incrementing = false;
Eloquent模型中需要School
。否则,当匹配关系时,它将被强制转换为int,丢失所有前导零。