您好,在我的场景中,我尝试在3个表上执行关于我已建立的连接系统的连接。我能够使用eloquent正确地将这3个表连接在一起并且返回结果没有问题,但是我试图更有效地完成它的工作。我不喜欢这样一个事实,即每个查询都会将默认值触发到select *
,因此我想要选择特定的列。我现在在哪里:
连接控制器代码
Groups::with([
'list.userAccount.profile'
])->where('user_id_fk', $my->user_id)
->orderBy('group_num', 'ASC')
->take(3)
->get(['group_num','group_title','group_id']);
群组设置模型
public function list() {
return $this->hasMany('App\UserConnections','group_id_fk');
}
用户连接模型
public function userAccount() {
return $this->hasOne('App\User','user_id_fk');
}
用户帐户模型
public function profile() {
return $this->hasOne('App\Profile','user_id_fk');
}
现在,如果我打电话给它指定的路线以获得用户示例结果如下:
{
"conn_id_fk": 2,
"user_id_fk": 10,
"type": 0,
"group_id_fk": 4,
"status": 1,
"created_at": "2017-02-09 13:58:34",
"updated_at": "2017-02-09 13:58:34",
"user_account": {
"user_id": 10,
"email": "someemail@email.com",
"verified": 0,
"locked": 0,
"code": 0,
"request": "",
"created_at": "2017-02-09 13:20:51",
"updated_at": "2017-02-09 13:20:51",
"profile": {
"user_id_fk": 3,
"first_name": "Jillian",
"last_name": "Jacobs",
"avatar": "",
"age": 0,
"about_me": "",
"one_liner": "",
"inspire": "",
"created_at": "2017-02-09 13:18:32",
"updated_at": "2017-02-09 13:18:32"
}
}
再次我的困境是,我不希望它select *
获取所有数据,这是不必要的,最终会减慢我的服务器速度,并且会花费我更多的钱单独一个人。
我尝试过做类似以下的事情:
public function profileEnd() {
return $this->hasOne('App\Profile','user_id_fk');
}
public function profile() {
return $this->profileEnd->select('first_name','last_name','avatar');
}
///////////////////// AND I have tried///////////////////////////
public function profileEnd() {
return $this->hasOne('App\Profile','user_id_fk');
}
public function profile() {
return $this->profileEnd->select(['first_name','last_name','avatar'])->get(); <---Returns 500
}
导致以下结果:
{
"conn_id_fk": 2,
"user_id_fk": 10,
"type": 0,
"group_id_fk": 4,
"status": 1,
"created_at": "2017-02-09 13:58:34",
"updated_at": "2017-02-09 13:58:34",
"user_account": {
"user_id": 10,
"email": "someemail@email.com",
"verified": 0,
"locked": 0,
"code": 0,
"request": "",
"created_at": "2017-02-09 13:20:51",
"updated_at": "2017-02-09 13:20:51",
"profile": null <------------------------------- Kills off the profile section
}
那么我在这里做错了什么,我该如何解决这个问题呢?非常感谢任何帮助。 提前致谢 干杯!
答案 0 :(得分:1)
Laravel需要键才能匹配相关的模型集合。在您的示例中,您没有选择密钥,因此在检索到记录后,Laravel不知道哪些配置文件与哪些用户帐户相关。将密钥添加到选择中你应该很高兴。
public function profileEnd() {
return $this->hasOne('App\Profile', 'user_id_fk');
}
public function profile() {
return $this->profileEnd->select('user_id_fk', 'first_name', 'last_name', 'avatar');
}