2 回答
TA贡献1757条经验 获得超7个赞
来自数据库查询的数据将始终格式化为平面数组,这就是数据库的工作方式。Eloquent 在幕后有很多魔法,它将正确的相关值映射到集合中的正确模型。
在使用连接时,Eloquent 无法知道哪些数据应该映射到哪个关系或属性。
如果你想使用连接查询,你要么必须为模型上的这些属性使用别名。或者,您可以在使用数据之前按照您想要的方式手动映射属性。
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,您应该使用一个复杂的查询来连接所有关系,并手动将别名映射到子数组中以获得最佳性能。
- 2 回答
- 0 关注
- 169 浏览
添加回答
举报
