为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
皈依舞 2022-06-17 14:34:53
我有 2 张桌子:User:idschedule_idnameSchedules:iddate我使用以下命令执行查询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 中,对于任何带有连接的查询,我总是得到单独的数组。
查看完整描述

2 回答

?
长风秋雁

TA贡献1757条经验 获得超7个赞

来自数据库查询的数据将始终格式化为平面数组,这就是数据库的工作方式。Eloquent 在幕后有很多魔法,它将正确的相关值映射到集合中的正确模型。

在使用连接时,Eloquent 无法知道哪些数据应该映射到哪个关系或属性。

如果你想使用连接查询,你要么必须为模型上的这些属性使用别名。或者,您可以在使用数据之前按照您想要的方式手动映射属性。


查看完整回答
反对 回复 2022-06-17
?
萧十郎

TA贡献1815条经验 获得超13个赞

好的,我可以建议一种更合适的方法来获取按 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,您应该使用一个复杂的查询来连接所有关系,并手动将别名映射到子数组中以获得最佳性能。


查看完整回答
反对 回复 2022-06-17
  • 2 回答
  • 0 关注
  • 169 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号