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 關注
- 139 瀏覽
添加回答
舉報