argenis95
argenis95

Reputation: 3

get a values using many to many relations on laravel 5 models

i'm really new working with laravel 5.0, so I got this problem when I try to retrieve a result using a model. I have a users table, with a list of users who can be a manager or not, they can have assigned one or more companies, or none, a company table with companies which can have one or many managers, and a pivot table that I called companies_managers. I set up the relations in every model like this:

/***User model***/
public function companies()
{
    return $this->belongsToMany('App\Company', 'companies_managers','id', 'manager_id');
}

and the same in Company model

public function managers()
{
    return $this->belongsToMany('App\User', 'companies_managers', 'id', 'company_id');
}

I want to get the managers assigned to a company using a company id to get it, but it just gave me an huge object without the values I looking for (the names of the managers assigned to that company). This is the code that I tried:

$managers = Company::find($id)->managers();

I would appreciate any help you can give me

Upvotes: 0

Views: 46

Answers (3)

argenis95
argenis95

Reputation: 3

Thank you for your help guys, I solved the issue fixing the relations in the models to this:

        return $this->belongsToMany('App\Company', 'companies_managers', 'manager_id', 'company_id');

and this

        return $this->belongsToMany('App\User', 'companies_managers', 'company_id', 'manager_id');

The IDs that I had set were not the correct ones for belongsToMany function

And this

$managers = Company::find($id)->managers();

was a problem too, was a dumb mistake of my part. I solved the return of Builder instance using just return instead of dd(), in that way I got the values I looking for. Thanks everyone!

Upvotes: 0

Tim Lewis
Tim Lewis

Reputation: 29258

Using ->managers() (with the brackets) doesn't actually return the associated managers, but rather a Builder instance (the "huge object"), which you can then chain with additional parameters before finally retrieving them with ->get() (or another closure, like ->first(), ->paginate(), etc)

Using ->managers (without the brackets), will attempt to access the associated managers, and execute any additional logic to retrieve them.

So, you have 2 options:

$company = Company::with(["managers"])->findOrFail($id);
$managers = $company->managers;

Or

$company = Company::findOrFail($id);
$managers = $company->managers()->get();

Both of those will perform the necessary logic to pull the managers. ->with() and no brackets is slightly more efficient, doing it all in a single query, so bear that in mind.

Upvotes: 1

Simon R
Simon R

Reputation: 3772

You just need to split out your code;

// this will find the company based on the id, or if it cannot find 
// it will fail so will abort the application
$company = Company::findOrFail($id); 


// this uses the active company record and gets the managers based 
// on the current company
$managers = $company->managers;

Upvotes: 0

Related Questions