alex4answ
@alex4answ

Условие для hasMany с связной таблицей?

Добрый день, есть 2 таблицы:

1. Товар (id, name, hasDelivery)
2. доставка (id, product_id, text)

Нужно достать все товары + доставку (только у товаров, у которых hasDelivery = 1), как это реализовать?

Сейчас у меня
public function getDelivery(){
        return $this->hasMany(Delivery::className(), ['product_id' => 'id']);
    }


Тоесть сейчас информацию о доставке ищется для всех товаров, хотя для большинства ее там нет, и быть не может. Пытался по разному, и добавлять условие в hasMany()->where, но будто нет связи с родительской таблицей

Как добавить условие, чтобы Доставку искало только у тех товаров, у которых стоит hasDelivery = 1 ?
  • Вопрос задан
  • 30 просмотров
Решения вопроса 1
webinar
@webinar Куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
Если нет доставки, то и в delivery будет пустой массив, я бы даже не создавал столбец hasDelivery, так как он избыточен, по наличию связанных строк и так ясно hasDelivery или нет. Так что не вижу проблемы, но можно попробовать так:
public function getDelivery(){
        return $this->hasDelivery ? $this->hasMany(Delivery::className(), ['product_id' => 'id']) : null;
}

если конечно в hasDelivery boolean и т.д.
Но Вы юзаете with так что там все равно 1 запросом все связи тянутся. Зачем городить тут что-то? В любом случае 2 запроса будет. 1 забирает продукт/продукты, 2-й связи к нему/ним. Так что Выкидываем столбец hasDelivery и заменяем методом в модели. Что-то типа:

public function getDelivery(){
        return $this->hasMany(Delivery::className(), ['product_id' => 'id']);
}

public function hasDelivery(){
        return count($this->delivery > 0);
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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