因为工作原因再次使用laravel,自然也是要写模型关联的代码,比如有自带的用户表users和用户信息表usersinfo
id,userid,address
模型名
UsersInfo.php
很简单的一对一关联
user模型内的定义
public function HasUsersInfo(){
return $this->hasOne('App\UsersInfo','userid');
}
随便插了几条数据(这里不展示其它数据,因为没意义)
用户表
用户信息表
然后假设我想查询id>1的用户名和地址
$Users=User::where('id','>',1)->with('HasUserInfo')
->get();
dd($Users);
结果
array:2 [▼
0 => array:6 [▼
"id" => 2
"name" => "gcud2"
"email" => "[email protected]"
"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" => "[email protected]"
"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,我也不想去研究英文的复数规则,直接模型里指定表名就是了