I have those two tables: apps
and categories
, they are in a M:M relationship, I have the apps_categories
table in place and the BelongsToMany()
relations in their models, they work fine.
Now, in a form I'm displaying all the records in apps, but I want to filter based on category_id
, so I have a $categories
array where I store the filters.
My problem is solved using the DB
facade doing like:
$apps = DB::table('apps')
->join('apps_categories', 'apps.id', '=', 'app_id')
->whereIn('category_id', $categories)
->select('apps.*')
->get();
So, I was wondering if there's a better way, using only the ORM. Thing is I have another table with a M:M relationship to apps
, and I'm supposing using the ORM would be a better way to handle both relationships
CodePudding user response:
You could use the whereHas method for this:
$apps = App::whereHas('categories', function ($query) use($categories) {
$query->whereIn('categories.id', $categories);
})->get();
Same as the above but uses an arrow function:
$apps = App::whereHas('categories', fn ($query) => $query->whereIn('categories.id', $categories))->get()
The 1st argument for whereHas
is the method name you have used for the relationship in your model (categories
) and
1st argument for the whereIn
is the table name and field (categories.id
).