這篇文章主要介紹了Laravel 關聯查詢返回錯誤id的解決方法,非常不錯,具有參考借鑒價值,需要的朋友參考下吧
在Laravel Eloquent 中使用join 關聯查詢,如果兩張表有名稱相同的字段,如id,那麼它的值會預設被後來的同名字段重寫,返回不是期望的結果。例如下列關聯查詢:
PHP
$priority = Priority::rightJoin('touch', 'priorities.touch_id', '=', 'touch.id') ->where('priorities.type', 1) ->orderBy('priorities.total_score', 'desc') ->orderBy('touch.created_at', 'desc') ->get();
$priority = Priority::rightJoin('touch', 'priorities.touch_id', '=', 'touch.id') ->where('priorities.type', 1) ->orderBy('priorities.total_score', 'desc') ->orderBy('touch.created_at', 'desc') ->get();
priorities 和touch 這兩張表都有id 字段,如果這樣建構查詢的話,傳回的查詢結果如圖:
Laravel 關聯查詢傳回錯誤的id
這裡id 的值不是priorities 表的id 字段,而是touch 表的id 字段,如果印出執行的sql 語句:
select * from `priorities` right join `touch` on `priorities`.`touch_id` = `touch`.`id` where `priorities`.`type` = '1' order by `priorities`.`total_score` desc, `touch`.`created_at` desc
select * from `priorities` right join `touch` on `priorities`.`touch_id` = `touch`.`id` where `priorities`.`type` = '1' order by `priorities`.`total_score` desc, `touch`.`created_at` desc
查詢結果如圖:
#使用sql 查詢的結果其實是對的,另外一張表重名的id 字段被預設命名為id1,但是Laravel 回傳的id 的值卻不是圖中的id 字段,而是被重名的另外一張表的字段重寫了。
解決方法是加一個select 方法指定字段,正確的建構查詢語句的程式碼:
PHP
$priority = Priority::select(['priorities.*', 'touch.name', 'touch.add_user']) ->rightJoin('touch', 'priorities.touch_id', '=', 'touch.id') ->where('priorities.type', 1) ->orderBy('priorities.total_score', 'desc') ->orderBy('touch.created_at', 'desc') ->get();
$priority = Priority::select(['priorities.*', 'touch.name', 'touch.add_user']) ->rightJoin('touch', 'priorities.touch_id', '=', 'touch.id') ->where('priorities.type', 1) ->orderBy('priorities.total_score', 'desc') ->orderBy('touch.created_at', 'desc') ->get();
這樣就解決了問題,那麼以後就要注意了,Laravel 兩張表join 的時候回傳的欄位最好要指定。
這算不算是 Laravel 的 bug 呢?如果一個欄位的值被同名的欄位值重寫了,這種情況要不要報一個錯誤出來,而不能預設繼續執行下去。
github 上有人也提出了同樣的問題,作者也提供了解決辦法,但並沒其他更好的方案。
Laravel 版本:5.3
連結:https://github.com/laravel/framework/issues/4962
以上就是本文的全部內容,希望對大家的學習有所幫助。
相關推薦:
#
以上是PHP中Laravel 關聯查詢傳回錯誤id的解決方法詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!