Marko Antonić
Marko Antonić

Reputation: 325

how to get a belongsToMany() query from a collection ? MySQL/Laravel

I'm using Laravel 5.4.22 (the newest one). In MySQL, I have two tables, tag_categories and tags, which form a many-to-many relationship. What I need is a query which returns all the tags for the selected categories. I know how to solve this when I have only one object, and I know how to solve this with querying and looping each of those objects, but there has to be a query or eloquent based solution for the whole thing?

I understand the code below doesn't work because I'm using ->belongsToMany on a collection rather than an object, but how to I bridge this gap the simplest way?

$resultingTags = TagCategory::whereIn('id', $chosenCategoriesIds)
                              ->belongsToMany(Tag::Class)->get();

dd($resultingTags);

Upvotes: 6

Views: 20007

Answers (2)

Devon Bessemer
Devon Bessemer

Reputation: 35337

belongsToMany generally belongs in the model class, not a method called on the fly. When looking to eager load the relationship, you then call the with() method on the query builder.

https://laravel.com/docs/5.4/eloquent-relationships#many-to-many

ex:

class User extends Model
{
    /**
     * The roles that belong to the user.
     */
    public function roles()
    {
        return $this->belongsToMany('App\Role');
    }
}

// Query
$users = User::with('roles')->get();
$rolesOfFirstUser = $users->first()->roles;

If you're trying to get all the tags of the given categories, then you should be querying tags, not tag_categories.

Tag::whereHas('categories', function ($query) use ($chosenCategoriesIds) {
    $query->whereIn('id', $chosenCategoriesIds);
})->get();

Upvotes: 8

Quynh Nguyen
Quynh Nguyen

Reputation: 3009

This is One-to-many relation

Define relation at TagCategory model at app/TagCategory.php

public function tags()
{
    return $this->hasMany('App\Tag');
}

And handle at your Controller

$resultingTags = TagCategory::whereIn('id', $chosenCategoriesIds)->with(['tags'])->get();

If you want define Many-To-Many relation for this case

You need to have 3 tables tags, tag_categories, tag_tag_category

Define relation at TagCategory model at app/TagCategory.php

public function tags()
{
    return $this->belongsToMany('App\Tag', 'tag_tag_category', 'tagcategory_id', 'tag_id');
}

And handle at your Controller

$resultingTags = TagCategory::whereIn('id', $chosenCategoriesIds)->with(['tags'])->get();

Upvotes: 2

Related Questions