Laravel 5.3 Eloquently Lazy / Eager在选择某些列时加载多个模型

时间:2017-02-10 02:14:02

标签: php laravel eloquent laravel-5.3

说明

您好,在我的场景中,我尝试在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
}

那么我在这里做错了什么,我该如何解决这个问题呢?非常感谢任何帮助。 提前致谢 干杯!

1 个答案:

答案 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');
}