由于工做缘由再次使用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,我也不想去研究英文的复数规则,直接模型里指定表名就是了