Отфильтруйте отношения «многие ко многим» на основе существования дочернего элемента и значения столбца. - PullRequest
3 голосов
/ 08 марта 2019

Я долго искал и не смог найти ответ, вот что у меня есть:

1- ShowCategory (идентификатор и заголовок)

class ShowCategory extends Model
{
    public function shows()
    {
         return $this->belongsToMany(Show::class, 'category_show');
    }
}

2 - Показать (id, title & active)

class Show extends Model
{
    public function categories()
    {
        return $this->belongsToMany(ShowCategory::class, 'category_show');
    }
}

Таким образом, существует отношение «многие ко многим», и мне нужно получить все элементы ShowCategory, к которым относится хотя бы одно шоу, и отфильтровать каждое шоу ShowCategory-> по show.active, только возвращать активные шоу

Вот что я пытаюсь сделать:

 $categories = ShowCategory::whereHas('shows', function($query) {
        $query->where('shows.active', '=', true);
    })->get();

Фильтрует только ShowCategory, которая включает шоу, и, если активен только один из этих шоу, он возвращает категорию со всеми шоу внутри, даже если другие не активны, мне нужно отфильтровать тех, кто не активен.

Что мне делать? Заранее спасибо

Ответы [ 3 ]

2 голосов
/ 08 марта 2019

Для этого требуется комбинация whereHas() и with(). Во-первых, whereHas() отфильтрует модель ShowCategory по тем, у которых есть активный Show, а предложение with() ограничит результаты отношения только возвращаемыми active:

$categories = ShowCategory::whereHas("shows", function($subQuery) {
    $subQuery->where("shows.active", "=", true); // See note
})->with(["shows" => function($subQuery){
    $subQuery->where("shows.active", "=", true);
}])->get();'

Примечание. Вы должны иметь возможность использовать active вместо shows.active, но зависит от того, находится ли этот столбец в нескольких таблицах.

Используя этот запрос, вы получите Collection из ShowCategory моделей, каждая с активными Show моделями, уже загруженными и доступными через ->shows:

foreach($categories AS $category){
    dd($category->shows); // List of `active` Shows
}
0 голосов
/ 08 марта 2019

Попробуйте, это может быть возможным способом получения связанных результатов.

// This will only return ShowCategory which will have active shows.
/* 1: */ \ShowCategory::has('shows.active')->get();

// So, logically this will only have active shows  -__-
$showCategory->shows

Laravel позволяет расширять внешние связи, используя эту нотацию . в качестве условия для восстановления.

Обновление

Вы должны обновить модель \ShowCategory как

 public function shows(){
     return $this->belongsToMany(Show::class, 'category_show')->where('active', true);
 }
0 голосов
/ 08 марта 2019

Это то, что вам нужно.

$categories = ShowCategory::whereHas('shows', function($query) {
    $query->whereActive(true);
})->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...