Задавайте вопросы, мы ответим
Вы не зашли.
Есть такая схема хранения данных:
1. Объект - object(id, name)
2. Параметры объекта - attribute(id, object_id, atribute_type_id, value)
3. Типа параметров - attribute_type(id, name)
Задача - вывести объекты с параметрами по определённой выборбке по параметрам (масло масленное).
Т.е. допустим нужно найти объекты с параметрами id = 1 и 2, где значения для 1 меньше n, а для 2 больше m
Правое полушарие мозга выдаёт следующее (реализация на Doctrine)
$query = new Doctrine_Query();
$query->select('id, obj.*, obj_attr.*, obj_attr_type.*')
->from('Attr attr')
->leftJoin('attr.Object obj')
->leftJoin('attr.AttrType attr_type')
->where('attr.value > '.$m' AND attr.attr_type_id = 1')
->addWhere('attr.value < '.$n.' AND attr.attr_type_id = 2')
->leftJoin('obj.Attr obj_attr')
->leftJoin('obj_attr.AttrType obj_attr_type');
На выходе массив, типа:
Attribute
Object
Attribute
Attribute_Type
Attribute
Attribute_Type
Attribute
Attribute_Type
Казалось бы и всё хорошо, да что-то меня смущает.
Вспомнить не могу как такая структура называется, поэтому и не могу найти что делать вообще...
Неактивен
Честно говоря, не понял, что Вы хотели сказать
Например, могу написать то же самое на SQL:
SELECT o.name, at.name, a.value FROM object o JOIN attribute a ON o.id = a.object_id JOIN attribute_type at ON at.id = a.id WHERE ((a.id = 1 AND a.value < n) OR (a.id = 2 AND a.value > m));
Неактивен
В итоге мы получим только объекты с искомыми атрибутами. Нужно получить сразу объект с привязанными к нему атрибутами
Неактивен
Угу, я понял, что вы хотите сказать. Атрибутов у объекта может быть несколько, и Вы
хотите выводить все атрибуты. Тогда я бы сделал через подзапрос:
SELECT o.name, at.name, a.value FROM object o JOIN attribute a ON o.id = a.object_id JOIN attribute_type at ON at.id = a.id WHERE o.id IN (SELECT DISTINCT object_id FROM attribute a WHERE ((a.id = 1 AND a.value < n) OR (a.id = 2 AND a.value > m)))
Неактивен