Поиск одновременно в двух таблицах
-
- Сообщения: 13
- Зарегистрирован: 2011.07.19, 09:40
Поиск одновременно в двух таблицах
Скорее всего, туплю, но все же...
Ситуёвина: есть две таблицы и две модели соответственно, скажем: A и B. В таблицах одинаковые наборы полей (условно): id, partnumber, price. Возможно ли одним запросом осуществить поиск в обеих таблицах, скажем по полю partnumber?
Объясню, почему данные в двух таблицах: хоть набор полей и одинаков, но данные хранящиеся в таблицах, относятся все-таки к несколько разным видам (хоть и одной сущности). Ну например, в таблице А хранятся "оригиналы", в таблице В - "замены для оригиналов".
Ну и кол-во записей в каждой порядка 1 000 000 - 3 000 000.
Гугл ничего не подсказал, к сожалению
Ситуёвина: есть две таблицы и две модели соответственно, скажем: A и B. В таблицах одинаковые наборы полей (условно): id, partnumber, price. Возможно ли одним запросом осуществить поиск в обеих таблицах, скажем по полю partnumber?
Объясню, почему данные в двух таблицах: хоть набор полей и одинаков, но данные хранящиеся в таблицах, относятся все-таки к несколько разным видам (хоть и одной сущности). Ну например, в таблице А хранятся "оригиналы", в таблице В - "замены для оригиналов".
Ну и кол-во записей в каждой порядка 1 000 000 - 3 000 000.
Гугл ничего не подсказал, к сожалению
Re: Поиск одновременно в двух таблицах
А почему бы не использовать UNION?
-
- Сообщения: 13
- Зарегистрирован: 2011.07.19, 09:40
Re: Поиск одновременно в двух таблицах
Ну вот это и пришло в голову сразу же. Но реализовано ли это в AR Yii!? Что-то в документации явно я не увидел про это.
-
- Сообщения: 13
- Зарегистрирован: 2011.07.19, 09:40
Re: Поиск одновременно в двух таблицах
Тут как бы получается паттерн наследование с одной таблицей, но наоборот - наследование от двух таблиц, что ли... А вот как бы его спроектировать - пока оригинальных мыслей нет
Единственное, что нашел это вот, но правки кода самого Yii не устраивают
Единственное, что нашел это вот, но правки кода самого Yii не устраивают
Последний раз редактировалось logonarium 2011.07.28, 18:12, всего редактировалось 2 раза.
Re: Поиск одновременно в двух таблицах
Можно попробовать так:
1. Описать два класса с разными таблицами
2. Переопределить метод instantiate()
3. Искать через findAllBySql()
1. Описать два класса с разными таблицами
2. Переопределить метод instantiate()
3. Искать через findAllBySql()
-
- Сообщения: 13
- Зарегистрирован: 2011.07.19, 09:40
Re: Поиск одновременно в двух таблицах
Ну и как бы вытекающее из всего размышление: а стоит ли заморачиваться с UNION!? Может, лучше все-таки через два разных SELECT'а черех A::model()->findAll() и В::model()->findAll()!? Тем более что искомое значение ищется через LIKE 'значение%' и характер хранящихся данных не позволяет создать по этом полю INDEX UNIQUE
Re: Поиск одновременно в двух таблицах
Вопрос был "Поиск одновременно в двух таблицах"
Конечно 2мя запросами. Разницы не увидите.
Конечно 2мя запросами. Разницы не увидите.
Re: Поиск одновременно в двух таблицах
Просто через UNION вы можете сортировать, группировать и т.д. данные из 2х таблиц
-
- Сообщения: 13
- Зарегистрирован: 2011.07.19, 09:40
Re: Поиск одновременно в двух таблицах
Принцип понятен.
Последний, уж совсем ламерский вопрос - что (или каким образом) переопределить в методе instantiate() ?
Последний, уж совсем ламерский вопрос - что (или каким образом) переопределить в методе instantiate() ?
Re: Поиск одновременно в двух таблицах
Тут нужно, чтобы был какой-то атрибут в выборке различный.
Добавить поля в разные таблицы.
Или делать запрос типа:
Код instantiate:
Добавить поля
Код: Выделить всё
`type` CHAR(1) DEFAULT 'x'
`type` CHAR(1) DEFAULT 'y'
Или делать запрос типа:
Код: Выделить всё
(SELECT *, 'x' AS `type` FROM table1) UNION ALL (SELECT *, 'y' AS `type` FROM table2)
Код: Выделить всё
public function instantiate($attributes)
{
//тип
$type = isset($attributes['type']) ? $attributes['type'] : 'unknown';
//первая таблица
if ($type === 'x')
{
return new Item1(null);
}
//вторая таблица
elseif ($type === 'y')
{
return new Item2(null);
}
//неизвестный тип
else
{
return parent::instantiate($attributes);
}
}
Re: Поиск одновременно в двух таблицах
1. А чем вам не нравится код приведенный вами же по ссылке, очень правильное решение, порождаем потомка от базового класса фреймворка и делаем его поведение нужным нам - это в общем то основная парадигма ООП, я так постоянно поступаю если базовый класс не дает нужного функционала, при этом он совершенно нативно живет и обрабатывается во всех частях фреймворка.
2. Вот еще одна хотелка в YII 2.0
2. Вот еще одна хотелка в YII 2.0