поиск по связанной таблице

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
an.viktory@gmail.com
Сообщения: 536
Зарегистрирован: 2016.09.05, 23:21

поиск по связанной таблице

Сообщение an.viktory@gmail.com »

есть таблица sale и tags:
sale
id, бла бла бла, ..
tags
id, sale_id, tag_id
как мне осуществлять поиск в таблице sale, если есть например номера tags 5,7,8
интересует именно оптимизированный поиск.
есть связь

Код: Выделить всё

public function getTags() {
$this->hasMany(Tags::className(),[ 'id' => 'sale_id']);
}
поиск

Код: Выделить всё

$sales = Sale::find()->where (.....) 
->??? ($this->tags in [5,7,8])
->all();
Последний раз редактировалось an.viktory@gmail.com 2017.11.17, 00:08, всего редактировалось 1 раз.
azz
Сообщения: 197
Зарегистрирован: 2016.07.06, 17:20

Re: поиск по связанной таблице

Сообщение azz »

возможно поможет viewtopic.php?f=19&t=45367
caHek2x
Сообщения: 1240
Зарегистрирован: 2016.04.12, 20:41

Re: поиск по связанной таблице

Сообщение caHek2x »

joinWith а потом andWhere([Tags::tableName().'.id'=>[5,7,8]])
an.viktory@gmail.com
Сообщения: 536
Зарегистрирован: 2016.09.05, 23:21

Re: поиск по связанной таблице

Сообщение an.viktory@gmail.com »

Код: Выделить всё

$sales = Sale::find()->where (.....) 
->joinWith(Tags::tableName())
->andWhere(['in', Tags::tableName().'.id', [5,7,8]])
->all();
так ?
an.viktory@gmail.com
Сообщения: 536
Зарегистрирован: 2016.09.05, 23:21

Re: поиск по связанной таблице

Сообщение an.viktory@gmail.com »

Invalid Parameter – yii\base\InvalidParamException

app\models\Sale has no relation named "tags".

Caused by: Unknown Method – yii\base\UnknownMethodException

Calling unknown method: app\models\Sale::getTags()
caHek2x
Сообщения: 1240
Зарегистрирован: 2016.04.12, 20:41

Re: поиск по связанной таблице

Сообщение caHek2x »

ну блин, связь у вас как называется? getTags значит ->joinWith('tags')

app\models\Sale has no relation named "tags".

говорит что в модели Sale нет такой связи ...
а где у вас эта связь о которой вы написали ?
an.viktory@gmail.com
Сообщения: 536
Зарегистрирован: 2016.09.05, 23:21

Re: поиск по связанной таблице

Сообщение an.viktory@gmail.com »

разобрался) просто не понимал что это такое вообще и как пишется
an.viktory@gmail.com
Сообщения: 536
Зарегистрирован: 2016.09.05, 23:21

Re: поиск по связанной таблице

Сообщение an.viktory@gmail.com »

// хочу чтобы в искомых записях был tag 93 и 96 но ничего не ищет только если один tag;

Код: Выделить всё

$tags_array = [93,96];
        $query = Sale::find()
            ->where(['not in', 'disactive', [1, 2]])
            ->joinWith(['tags']);
        foreach ($tags_array as $item) {
            $query->andWhere([RealTags::tableName() . '.tag_id' => $item]);
        }

        $query->limit(5);
         $sales = $query->all();
        
caHek2x
Сообщения: 1240
Зарегистрирован: 2016.04.12, 20:41

Re: поиск по связанной таблице

Сообщение caHek2x »

убираем цикл ...
и пишем $query->andWhere([RealTags::tableName() . '.tag_id' => $tags_array]);

это будет условие "ИЛИ"
а если вам надо записи в которых есть И первый И второй тег то тут уже надо помудрить немного ... например можно добавить group by и having где count(*)=2 (т.к. 2 тега ...)

а цикл убираем потому что ... ну блин хоть немного подумайте, это наподобии: дайте мне один стакан который полностью красного цвета И полностью зеленого цвета ... такого же быть не может ... а вы именно такой запрос делаете ...
an.viktory@gmail.com
Сообщения: 536
Зарегистрирован: 2016.09.05, 23:21

Re: поиск по связанной таблице

Сообщение an.viktory@gmail.com »

так вот как мне сделать?? моя задача конкретна: выбрать те записи, где массив искомых тегов является подмножеством множества тегов из связанной таблицы.
caHek2x
Сообщения: 1240
Зарегистрирован: 2016.04.12, 20:41

Re: поиск по связанной таблице

Сообщение caHek2x »

Код: Выделить всё

$query->andWhere([RealTags::tableName() . '.tag_id' => $tags_array]);
$query->groupBy("sale_id");
$query->having(new Expression("count(*)=".count($tags_array)));
если не опечатался то как то так
an.viktory@gmail.com
Сообщения: 536
Зарегистрирован: 2016.09.05, 23:21

Re: поиск по связанной таблице

Сообщение an.viktory@gmail.com »

эврика!!!!!! спасибо )))
an.viktory@gmail.com
Сообщения: 536
Зарегистрирован: 2016.09.05, 23:21

Re: поиск по связанной таблице

Сообщение an.viktory@gmail.com »

ИзображениеПродолжаем...
допустим

Код: Выделить всё

Sale: id, id_address, .... 
и

Код: Выделить всё

Addresses:id, ....
Связь (sale имеет свой уникальный адрес):

Код: Выделить всё

 public function getAddress() {
        return $this->hasOne(Addresses::className(), ['id' => 'id_address']);
       
    }
    
и

Код: Выделить всё

RealTags: id, sale_id, id_address_tag, tag_id
и
Связь

Код: Выделить всё

public function getTags() {
        return $this->hasMany(RealTags::className(), ['id_address_tag' => 'id'])->select('tag_id')->column();
    
    }
    
Получается что RealTags для конкретной модели сидят в sale_id и id_address_tag через id_address.
как мне теперь искать по tags которые и в sale_id и в id_address_tag ;
Возможно коряво объяснил! не ругайтесь)
an.viktory@gmail.com
Сообщения: 536
Зарегистрирован: 2016.09.05, 23:21

Re: поиск по связанной таблице

Сообщение an.viktory@gmail.com »

Проще говоря поиск ведется через две связи (одна прямая, другая через таблицу).
Nex-Otaku
Сообщения: 831
Зарегистрирован: 2016.07.09, 21:07

Re: поиск по связанной таблице

Сообщение Nex-Otaku »

искать по tags которые и в sale_id и в id_address_tag
Ничего не понятно. Что требуется сделать?

Выразите свой вопрос без терминов программирования, на конкретных примерах. Приведите примеры тегов, адресов, записей. А потом выразите мысль человеческими терминами.

Как в соседней теме писали: "машины делятся на категории, легковые и грузовые, легковые опять же делятся на категории по марке автомобиля; в записи машины указана подкатегория; нужно найти все легковые машины".

Что-то в этом роде.
Ответить