猿问

Laravel:如何将连接表加载到子数组中?

我有 2 张桌子:


User:

id

schedule_id

name


Schedules:

id

date

我使用以下命令执行查询eager loading:


User::with (['schedules'])->get()->first();

并得到这样的结果:


[

    'id' => '3',

    'schedule' => [

        'id' => '13',

        'date' => '20.11.2020',

    ],

    'name' => 'John',

];

但是当我使用执行类似的查询时join,


User::join ('schedules', 'user.schedule_id', '=', 'schedules.id')->get()->first();

我得到了这样的结果,合并数组:


[

    'id' => '13',

    'date' => '20.11.2020',

    'name' => 'John',

];

如何在 Eloquent 中使用 join 获得分离数组的结果?


注意:在原始 PHP 和 PDO 中,对于任何带有连接的查询,我总是得到单独的数组。


皈依舞
浏览 173回答 2
2回答

长风秋雁

来自数据库查询的数据将始终格式化为平面数组,这就是数据库的工作方式。Eloquent 在幕后有很多魔法,它将正确的相关值映射到集合中的正确模型。在使用连接时,Eloquent 无法知道哪些数据应该映射到哪个关系或属性。如果你想使用连接查询,你要么必须为模型上的这些属性使用别名。或者,您可以在使用数据之前按照您想要的方式手动映射属性。

萧十郎

好的,我可以建议一种更合适的方法来获取按 Laravel 的 Eloquent 中的关系列排序的结果。您应该使用 2 个查询。首先只获取 id,但按任何关系的列排序。(您不能使用预先加载按关系列排序结果)$idsRaw = User::join ('schedules', 'user.schedule_id', '=', 'schedules.id')    ->select ('users.id')    ->orderBy ('schedules.date')    ->get ()->toArray ();$ids = \array_column ($idsRaw, 'id');其次,使用预先加载的关系子数组获得良好的结果:User::with (['schedules'])    ->whereIn ('user.id', \implode (',', $ids))    ->orderByRaw('FIELD(' . $ids . ',' . \implode(',', $ids) . ')')    ->get()->toArray ();优点:您不需要手动将列和别名映射到子数组中(如果您有很多关系,这可能会非常困难)。缺点:此方法的运行速度与您拥有的 id 一样慢。是的,如果您在查询中有数千个 id,您应该使用一个复杂的查询来连接所有关系,并手动将别名映射到子数组中以获得最佳性能。
随时随地看视频慕课网APP
我要回答