亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 139 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號