由於工做緣由再次使用laravel,天然也是要寫模型關聯的代碼,好比有自帶的用戶表users和用戶信息表usersinfophp
id,userid,addresshtml
模型名laravel
UsersInfo.php閉包
很簡單的一對一關聯this
user模型內的定義spa
public function HasUsersInfo(){ return $this->hasOne('App\UsersInfo','userid'); }
隨便插了幾條數據(這裏不展現其它數據,由於沒意義)code
用戶表htm
id | name |
1 | gcud |
2 | gcud2 |
3 | gcud3 |
用戶信息表ci
id | address | userid |
1 | 地址1 | 1 |
2 | 地址2 | 2 |
3 | 地址3 | 3 |
而後假設我想查詢id>1的用戶名和地址文檔
$Users=User::where('id','>',1)->with('HasUserInfo') ->get(); dd($Users);
結果
array:2 [▼ 0 => array:6 [▼ "id" => 2 "name" => "gcud2" "email" => "gcud2@163.com" "created_at" => null "updated_at" => null "has_user_info" => array:3 [▼ "id" => 2 "address" => "地址2" "userid" => 2 ] ] 1 => array:6 [▼ "id" => 3 "name" => "gcud3" "email" => "gcud3@163.com" "created_at" => null "updated_at" => null "has_user_info" => array:3 [▼ "id" => 3 "address" => "地址3" "userid" => 3 ] ] ]
雖然能獲得結果,但列出全部字段的結果並非我想要的,因而如同往常的,我在get裏限定了列
$Users=User::where('id','>',1)->with('HasUserInfo') ->get(['name']); dd($Users->toArray());
結果
array:2 [▼ 0 => array:2 [▼ "name" => "gcud2" "has_user_info" => null ] 1 => array:2 [▼ "name" => "gcud3" "has_user_info" => null ] ]
確實是只剩下名字,但地址也跟着空了,經谷歌搜索和5.4文檔上寫的,好像是要在with關聯裏面寫閉包,指定字段,大概是這個樣子
$Users=User::where('id','>',1) ->with(['HasUserInfo'=>function($query){ $query->select('address'); }]) ->get(['name']); dd($Users->toArray());
然而結果仍然爲空,不知是我眼拙仍是什麼,我反正是沒在5.4文檔找到模型關聯查詢指定字段的方法,谷歌搜來搜去都是在說要用閉包select來指定字段,就是像上面寫的那樣
當時用谷歌搜索時前幾個老是思否的幾個問題,在別人的問題的幾輪迴復提問下我仍是找到了答案,那就是閉包內和原模型都要傳入關聯字段
$Users=User::where('id','>',1) ->with(['HasUserInfo'=>function($query){ $query->select('userid','address'); }]) ->get(['id','name']); dd($Users->toArray());
結果
array:2 [▼ 0 => array:3 [▼ "id" => 2 "name" => "gcud2" "has_user_info" => array:2 [▼ "userid" => 2 "address" => "地址2" ] ] 1 => array:3 [▼ "id" => 3 "name" => "gcud3" "has_user_info" => array:2 [▼ "userid" => 3 "address" => "地址3" ] ] ]
真坑,卡了我很一下子,寫這篇文章時我又去搜了谷歌,發現第一條就是就是須要的,雖然沒有明確指明要帶關聯,看看還能能很快知道的
哦,另外還有一個小坑的地方就是模型名稱,從直覺來看,默認狀況下模型名是表名加個s,但若是不仔細看文檔可能會出問題,文檔裏面說了
除非數據代表確地指定了其它名稱,不然將使用類的「蛇形名稱」、複數形式名稱來做爲數據表的名稱。
通常狀況下直接加s是沒問題的,但別忘了說的是複數形式,在英文中某些特殊字母結尾的單詞並非直接加s,好比study的複數形式是studies,也就是說模型名爲Study.php,默認表名得是studies,我也不想去研究英文的複數規則,直接模型裏指定表名就是了