Laravel 5急切加载从外键中删除前导零

时间:2017-08-03 19:22:19

标签: php laravel eloquent laravel-5.3 leading-zero

我相信当外键是包含零填充数字的字符串时,我遇到了Laravel 5.3如何处理预先加载的错误。

我有两个模型(使用mysql后端),SchoolStudentid中的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中存储的StudentSchool分开使用时可以成功连接到相应的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()会成功。我仍然感到神秘。

1 个答案:

答案 0 :(得分:2)

您没有展示模型类,但我猜您在public $incrementing = false; Eloquent模型中需要School。否则,当匹配关系时,它将被强制转换为int,丢失所有前导零。