Kohana: Как загрузить все отношения «многие ко многим» в одном запросе - PullRequest
1 голос
/ 15 октября 2010

У меня есть связь с базой данных, которая выглядит примерно так:

booking -> person <-> option

->  : one-to-many
<-> : many-to-many

Теперь мне нужно перечислить всех людей в бронировании со всеми их вариантами.Используя ORM в кохане, я могу загрузить всех людей следующим образом:

$persons = ORM::factory('booking', $id)->persons->find_all();

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

booking
 └ id
 └ created
 └ persons
    └ 0
      └ id
      └ name
      └ options
         └ 0
           └ id
           └ price
         └ n
           └ id
           └ price
    └ n
      └ id
      └ name
         └ options
         └ 0
           └ id
           └ price
         └ n
           └ id
           └ price

Я, вероятно, должен написать собственный запрос к базе данных для этого, но даже тогда я не совсем уверен, как это сделать.Мой SQL-фу не самый лучший: p

Ответы [ 3 ]

0 голосов
/ 15 октября 2010
  1. Попробуйте $persons = ORM::factory('booking', $id)->persons->with('booking')->find_all();
  2. Вы можете добавить booking отношение для автозагрузки, используя load_with свойство:

    класс Model_Person расширяет ORM {

    protected $_belongs_to = array('booking');
    protected $_load_with = array('booking');
    

    }

Таким образом, когда вы загружаете объект Person, он автоматически объединяется с соответствующей моделью бронирования одним запросом.

0 голосов
/ 07 марта 2013

Исходя из своего опыта, я могу сказать, что вы должны использовать ORM только тогда, когда вам это нужно; иногда лучше использовать простые запросы SQL (используя модуль базы данных)

Теперь, когда вы хотите, чтобы результат был объектом, вы можете использовать метод -> as_object ('Model_Name'), непосредственно перед использованием -> execute () в запросе к базе данных.

Надеюсь, это поможет:)

0 голосов
/ 15 октября 2010

Если вы используете ORM, вам вообще не нужно писать SQL.

Вы найдете это руководство полезным.

http://www.scribd.com/doc/5022685/Kohana-PHP-ORM-Guide-Volume-1- Я думаю, что этодля ORM, который был во второй версии Kohana, но я не верю, что он сильно отличается.Ваш пробег может варьироваться.

Имейте в виду, что ORM требует довольно определенных соглашений об именах.Если у вас есть старая база данных, которая имеет другое соглашение об именах, чем ORM, вы можете отказаться от ORM и вернуться к использованию SQL.В справке Kohana есть много примеров.

...