Запрос соединения «многие ко многим» в CodeIgniter

Все предыдущие попытки JOIN оставили меня либо с данными диска, либо с данными элемента, заполняющими идентификатор, ключи заголовка результата (возможно, происходит конфликт).

Так что я:

item table
fields: id, title

disc table
fields: id, title

item_disc table
fields: item_id, disc_id

Как мне создать двойное соединение, чтобы я мог получить доступ к связанным дискам с элементом. В настоящее время я запускаю два отдельных запроса: один для записи одного элемента, затем один для массива дисков.

Помимо того, что это проще сделать в одном запросе с объединениями, если я когда-либо захочу получить более 1 записи, мне в настоящее время нужно будет выполнять 2 запроса на элемент, поскольку я не могу присоединиться к своим данным.

Пожалуйста помоги!! Я чувствую, что это мое последнее препятствие «многие ко многим» (хотя я не осмеливаюсь говорить слишком рано).


person Community    schedule 25.01.2010    source источник


Ответы (2)


поскольку и элемент, и диск имеют столбцы с именами id и title, они перезапишут друг друга. вам нужно будет использовать as, чтобы различать их...

для всех предметов и связанных с ними дисков:

select m.*, i.title as item_title, d.title as disc_title
from item i, disc d, item_disc m where i.id = m.item_id and
d.id = m.disc_id order by i.title, d.title

за одно изделие и его диски:

select m.*, i.title as item_title, d.title as disc_title
from item i, disc d, item_disc m where i.id = m.item_id = ? and
d.id = m.disc_id order by d.title

заменять ? с желаемым товаром

person jspcal    schedule 25.01.2010
comment
кроме того, что он абсолютно идеален!!!!! почему мне не нужно использовать JOIN (я использую ActiveRecord, и ваш запрос преобразован в тот, который работает как есть). Запутался теперь! - person ; 25.01.2010
comment
кроме того, какой-нибудь умный способ сделать результат более интуитивно понятным для работы, например, item_id, item_title только один раз с подмассивом дисков? или мне просто нужно обработать его по своему вкусу, используя foreach. - person ; 25.01.2010
comment
@esrylx: в основном sql не очень хорош для вложенных результатов, поэтому потребитель данных должен перебирать набор результатов и проверять, когда item_id изменяется, чтобы определить конец группировки ... - person jspcal; 25.01.2010

Вот реализация CodeIgniter отношений базы данных «многие ко многим», которую я компилирую в виде серии скринкастов. Это абстрактно и не предназначено для использования в производственной среде как есть. Таким образом, это должно помочь прояснить концепцию.

http://www.mattborja.com/web-development/codeigniter/databases/many-to-many-relationships-in-codeigniter-abstract/

person Matt Borja    schedule 09.01.2011