Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.

Dreferr's avatar

Stopping the default Select * query in a multiple relationship eloquent statement

Hello, in my scenario I'm trying to perform joins on 3 tables regarding a connections system I've built up. I'm able to use eloquent to connect these 3 tables together correctly and return the results no problem however, I'm trying to be more efficient in how it's done. I don't enjoy the fact that every query eloquent fires off defaults to a select * so I'd like to select specific columns instead. Here's where I'm currently at:

*** Connection Controller Code***

 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']);

*** Group Settings Model ***

 public function list() {
    return $this->hasMany('App\UserConnections','group_id_fk');
 }

*** User Connections Model ***

public function userAccount() {
    return $this->hasOne('App\User','user_id_fk');
}

*** User Account Model ***

public function profile() {
    return $this->hasOne('App\Profile','user_id_fk');
}

Now, If I make a call to it's assigned route to get users an example result is the following:

{
    "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": "[email protected]",
      "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"
      }
    }

Again My dilemma is that I don't want it to do select * to get all that data, it's unnecessary and will eventually slow down my server and cost me more money on I/O alone.

I've tried doing something like the following for example:

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
}

which results in the following:

{
    "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": "[email protected]",
      "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
    }

So What am I doing wrong here and how can I fix this? Any assistance is greatly appreciated. Thanks in advance Cheers!

0 likes
3 replies
ankitparmar372's avatar

Try this public function profileEnd() { return $this->hasOne('App\Profile','user_id_fk')->select('first_name','last_name','avatar'); }

1 like
Dreferr's avatar

Thanks for your quick response, regrettably I'm still getting a null returned on the profile_end object...

Dreferr's avatar
Dreferr
OP
Best Answer
Level 2

Didn't realize the answer was so simple, apparently Laravel needs an id to index on otherwise it won't be able to do internal selects

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

Please or to participate in this conversation.