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

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
dstol
Сообщения: 6
Зарегистрирован: 2011.07.19, 21:33

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

Сообщение dstol »

Итак имеем relation

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

'products' => array(self::MANY_MANY, 'Product',
                '{{manufacturer_products}}(manufacturer_id, manufacturer_id)'),
 
Поиск делаю так

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

$model->attributes = $_GET['SearchForm'];
$criteria->addSearchCondition('t.name', $model->text, true);
$criteria->addSearchCondition('products.name', $model->text, true, 'OR');
$manufacturer = Manufacturer::model()->findAll($criteria);
 
Если ключевое слово является производителем то поиск осуществляется нормально. Но если ключевое слово товар, то выводится производитель только с товаром удовлетворяющим поисковой фразе. Как сделать чтобы выводились все товары производителя если хотя бы один из них удовлетворяет ключевому слову. Заранее спасибо.
Аватара пользователя
because
Сообщения: 689
Зарегистрирован: 2010.09.30, 22:01

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

Сообщение because »

Можно так:
OR EXISTS (
SELECT * FROM `products` WHERE name = '$model->text'
)
RTFM !
Johnatan
Сообщения: 167
Зарегистрирован: 2010.10.27, 13:06
Откуда: Reino de España

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

Сообщение Johnatan »

Вы ищите только по двум условиям где указан критерий. В первом критерии также добавьте 'OR' в качестве последнего аргумента, а строку выборки измените вот так:
$manufacturer = Manufacturer::model()->with('products')->findAll($criteria);
Конференция: [email protected]
dstol
Сообщения: 6
Зарегистрирован: 2011.07.19, 21:33

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

Сообщение dstol »

because писал(а):Можно так:
OR EXISTS (
SELECT * FROM `products` WHERE name = '$model->text'
)
Да это похоже на то что нужно. Непонятно как записать это через CDbCriteria.
Johnatan писал(а):В первом критерии также добавьте 'OR' в качестве последнего аргумента
Не играет никакой роли.
Johnatan писал(а): $manufacturer = Manufacturer::model()->with('products')->findAll($criteria);
Тут я ошибся. Так и пробовал искать. Проблема не в том что не ищет, а в том что для производителя выбираются только те товары которые подходят под LIKE, а нужны все
dstol
Сообщения: 6
Зарегистрирован: 2011.07.19, 21:33

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

Сообщение dstol »

Нашел один из вариантов решения задачи. Суть в том чтобы на первом шаге выбрать все id производителей удовлетворяющих заданным условиям, а затем выбрать модели по первичному ключу.

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

$model->attributes = $_GET['SearchForm'];
$criteria->addSearchCondition('t.name', $model->text, true);
$criteria->addSearchCondition('products.name', $model->text, true, 'OR');
$ids = Manufacturer::model()->with('products')->findAll($criteria);
$p_keys = array();
foreach ($ids as $id) {
  $p_keys[] = $id->id;
}
$manufacturer = Clinic::model()->findAllByPk($p_keys);
 
В принципе такой вариант вполне рабочий, но может кто-нибудь предложит другой?
Аватара пользователя
because
Сообщения: 689
Зарегистрирован: 2010.09.30, 22:01

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

Сообщение because »

dstol писал(а):
because писал(а):Можно так:
OR EXISTS (
SELECT * FROM `products` WHERE name = '$model->text'
)
Да это похоже на то что нужно. Непонятно как записать это через CDbCriteria.
попробуйте записать через addCondition()
RTFM !
esche
Сообщения: 1054
Зарегистрирован: 2010.11.24, 03:39

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

Сообщение esche »

В принципе такой вариант вполне рабочий, но может кто-нибудь предложит другой?
Если "ручками" - то это дополнительный JOIN со второй таблицей products или второй подзапрос...
Скорее всего, и то и другое уступает в производительности... (да и в удобстве работы, пожалуй)
...
TM123
Сообщения: 608
Зарегистрирован: 2011.06.09, 11:18

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

Сообщение TM123 »

На сколько я понял, вам надо написать 2 разных запроса выборки, возвращающих одинаковый набор полей, но выбирающих их по разному принципу - это будет на много проще, т.к. определить какой запрос использовать можно очень просто - по заданному параметру. Если пытаться все впихнуть в один запрос, то это может либо не получиться, либо что еще хуже, запрос начнет тормозить на реальных наборах данных, но узнаете вы об этом только при запуске проекте или спустя какое-то время, если не сделаете тестовый стенд и не проверите.
Ответить