@Leopandro
Разработчик CRM/ERP систем

Как сделать поиск по полю связанной таблицы?

этим кодом я выполняю поиск продуктов по айди ингридиента, если ингридиент не видим то и продукт должен быть не видим.
$subQuery = (new Query())
            ->select('product.id as id, product.name as name, ingredient.visible, count(product_ingredient.product_id) as cnt from product')
            ->innerJoin(ProductIngredient::tableName(), 'product.id = product_ingredient.product_id')
            ->innerJoin(Ingredient::tableName(), 'ingredient.id = product_ingredient.ingredient_id')
            ->where(['product_ingredient.ingredient_id' => $this->ids])
            ->andFilterWhere(['ingredient.visible' => 1])
            ->groupBy('product.id, product.name, ingredient.visible')
            ->orderBy('cnt');

Но т.к. у продукта может быть несколько ингридиетов выражение ->andFilterWhere(['ingredient.visible' => 1]) анулируется если хоть 1 ингридиент видим. Как исправить?
ProductIngredient - промежуточная таблица
  • Вопрос задан
  • 206 просмотров
Пригласить эксперта
Ответы на вопрос 1
@vyrkmod
Пишу на php. И не стыдно.
В where заменяем "ingredient.visible" на "MIN(ingredient.visible) as vis", andFilterWhere меняем на having(['vis'=>1]).
Замечания:
Зачем столько группировок? "product.id" тут более чем достаточно
Почему то ProductIngredient::tableName(), то "product_ingredient" строкой? Может хотя бы в своём куске кода к общему стилю всё привести?
Зачем andFilterWhere? Оно ж используется связкой GridView + DataProvider для добавления условий к имеющейся выборке.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы