serg_small_developer
@serg_small_developer
Начинающий прогер

Как сделать выборку через hasMany?

Всем привет. никак не могу понять в чем дело как сделать.
Вообщем у меня есть product_id а нужно получить shop_id, вот набросал пример из базы данных
5aaac9dbe5004013734382.jpeg
т.е. пройти по порядку слева направо по таблицам по очередности выбирая нужные поля, пробую делать вот так, в модели таблицы product вызываю getshopCity()
public function getProductPrice()
    {
        return $this->hasMany(shopProductPrice::className(),['product_id'=>'product_id']);
    }

    public function getProductCity()
    {
        return $this->hasMany(shopCity::className(),['shop_city_id'=>'shop_city_id'])->via('productPrice');
    }

    public function getshopCity()
    {
        return $this->hasMany(shop::className(),['shop_id'=>'shop_id'])->via('productCity');
    }

все работает только если вся связка есть, но если например у меня есть товар в product, но его нет в таблице shop_product_price то так сказать связка нарушается и мне пишет что shop_city_id нет, как мне сделать чтобы когда отсутствует соответствующая запись в таблице shop_product_price оно его пропускало и выбирало только записи с полной связкой,
пробовал в getProductPrice() заменить
return $this->hasMany(shopProductPrice::className(),['shop_Product_id'=>'shop_Product_id']);

на простую выборку с базы с условием что product_id не равно NULL но так вообще не работает,
подскажите может я что-то не так делаю?)
  • Вопрос задан
  • 96 просмотров
Решения вопроса 2
qonand
@qonand
Software Engineer
во первых: Вы неудачно подобрали названия таблиц и полей в них (и соответственно моделей)
1. shop_city - в комментария Вы пишите что это список филиалов, а судя по названию просто таблица связей. Уж лучше заменить ее название на что-то более подходящее, например (первое что пришло в голову): shop_office
2. shop_product_price - по названию можно сказать что это цены товаров в магазине, но если вникнуть, то оказывается что это цены товаров в ФИЛИАЛАХ МАГАЗИНА.

во вторых: связь выбирающая магазин должна находиться не в модели Product а в модели филиалов, да и с сами названия связей выбраны не удачно - только путают.
Т.е. в модели Товаров должна быть связь выбирающая филиалы, в модели филиала - связь выбирающая магазин

в третьих: когда Вы наведете порядок в связях, мы можете получить необходимую информацию либо с помощью запроса
Product::find()->with(['<название связи с филиалом>.<название связи филиала с магазином>'])

либо, если Вам нужно вывести товары у которых есть все связи
Product::find()->joinWith(['<название связи с филиалом>.<название связи филиала с магазином>'], true, 'RIGHT JOIN')
Ответ написан
serg_small_developer
@serg_small_developer Автор вопроса
Начинающий прогер
решил сам!), сделал вот так в модели
public function getProductCity()
    {
        return $this->hasMany(shopCity::className(),['shop_city_id'=>'shop_city_id'])->via('productPrice');
    }

    public function getshopCity()
    {
        return $this->hasMany(shop::className(),['shop_id'=>'shop_id'])->via('productCity');
    }

и такой вызов делаю
Product::find()
			->select("*")
            ->leftJoin('shop_product_price', 'shop_product_price.product_id = product.product_id')
			->where(['like', 'name', $model->name . '%', false])
			->with(['manufacturer', 'shopCity'])
			->asArray()
			->all()
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы