Что такое условие подсчета отношений в WhereHas Laravel

Мне сложно понять условие подсчета отношений в WhereHas. На странице документации это не обсуждается, но об этом говорится на странице API. Цитата из API.

Builder | Builder whereHas (строка $ отношение, Closure $ callback, строка $ operator = '> =', int $ count = 1)

Добавьте в запрос условие подсчета отношений с помощью предложений where.

Пример

Модель Resource имеет отношение "многие ко многим" с ResourceCategory

public function categories()
{
    return $this->belongsToMany('ResourceCategory', 'resource_category_mapping');
}

Условие родства в Has

Условие связи в Has работает должным образом.

Resource::has('categories', '>', 1)->get()
//this return all resources which have more than one catgories

Условие взаимоотношений в WhereHas

Условие отношений в WhereHas работает не так, как ожидалось. Я уверен, что неправильно это понял.

Resource::whereHas('categories', function ( $query){
            $query->whereIn('resource_category_id', [1, 2, 4]);
        }, '>', 1)->get()

Приведенный выше код должен возвращать ресурсы, категории которых принадлежат одной из [1, 2, 4], а ресурс имеет более одной категории. Но это не так.

Вопрос

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


person hhsadiq    schedule 25.07.2015    source источник


Ответы (1)


Обычно whereHas () проверяет, имеет ли ваша модель хотя бы одну связанную модель. Вы можете установить для $ count более высокое значение, чтобы увеличить счет до N и получать только те модели, которые имеют как минимум N связанных моделей.

В вашем случае звонок

Resource::has('categories', '>', 2)->get();

вернет только те ресурсы, которые имеют не менее 2 связанных категорий.

person jedrzej.kurylo    schedule 25.07.2015
comment
Можете ли вы проверить мое объяснение моего кода whereHas «Приведенный выше код должен возвращать ресурсы, категории которых принадлежат одной из [1, 2, 4], а ресурс имеет более одной категории». Это правильно...? - person hhsadiq; 25.07.2015
comment
Работает на меня. Вставьте полученный запрос - замените get () на toSql () - и вставьте его сюда. - person jedrzej.kurylo; 25.07.2015
comment
выберите * из resource, где _2 _._ 3_ равно нулю и first_name =? и (выберите count (*) из resource_category внутреннего соединения resource_category_mapping на _7 _._ 8_ = _9 _._ 10_, где _11 _._ 12_ = _13 _._ 14_ и resource_category_id в (?,?,?,?)) = 3 - person hhsadiq; 25.07.2015
comment
Откуда это = 3? ты это добавил? В остальном запрос выглядит нормально. - person jedrzej.kurylo; 25.07.2015
comment
извините, я просто возился с кодом. Вы можете заменить его на ›1 - person hhsadiq; 25.07.2015
comment
Как я уже сказал, запрос выглядит нормально, вы уверены, что у вас правильные данные? У вас есть записи, соответствующие вышеуказанным условиям? - person jedrzej.kurylo; 25.07.2015
comment
Ока, теперь я понял. Он работает отлично. На самом деле мне было трудно понять, как работает счетчик отношений с WhereHas. Я протестировал много кейсов и некоторое время играл с ними, и теперь я понял. Большое спасибо за вашу помощь. - person hhsadiq; 25.07.2015
comment
Я искал это сегодня весь день, спасибо, это все еще помогает через 3 года :) - person Wasif Khalil; 08.09.2018
comment
Это зависает для меня, есть 2K результатов, интересно, имеет ли это какое-то отношение к этому. это своеобразное решение, которое я ищу, хотя - person Harry Bosh; 26.08.2020