Как выполнять соединения с литиевыми моделями?

Я прочитал литий\данные\модель\запрос, но не нашел примеров объединений.


person ton.yeung    schedule 22.02.2012    source источник
comment
вы смотрели тест-кейсы? может есть какие...   -  person Tomen    schedule 22.02.2012
comment
@Tomen Когда я написал вопрос, нет, спасибо за предложение. Я только что проверил это, но я не совсем уверен, что делает тест? Какими должны быть foo, bar и baz?   -  person ton.yeung    schedule 22.02.2012


Ответы (2)


Существует несколько способов выполнить соединение с Lithium.

  1. Lithium будет обрабатывать объединения для вас, где вы определили отношения (примеры в руководстве ).
  2. Вы можете добавить соединения к существующему объекту Query, используя метод join() (см. API)).
  3. Вы можете передать массив объектов Query поисковикам, используя ключ joins.
  4. Вы можете передать SQL непосредственно в соединение, используя Connection->read().

Другие методы достаточно хорошо документированы, поэтому я приведу пример передачи объектов Query поисковику.

$fields = array('id', 'name', 'slug');                                                                                                                                                                                                  
$joins = array();
$joins[] = new Query(array(
  'source' => 'client_tests',  
  'constraint' => array('Test.id' => 'client_tests.test_id'),
));
$conditions['client_id'] = $this->data['client_id'];
$tests = Test::all(array(
   'conditions' => $conditions,
   'fields' => $fields,
   'joins' => $joins
));

source — это таблица, к которой вы хотите присоединиться, а constraint — это критерии присоединения. Литий присваивает таблице поиска имя модели, поэтому используйте это в своем ограничении. Затем вы можете передать соединения любому поисковику вместе с любыми другими параметрами, которые вы хотите.

Обратите внимание, что на момент написания статьи соединения (и отношения) будут работать только с реляционной базой данных, а не с такими вещами, как DBRef MongoDB.

Обновление: удалены ссылки, которые были взломаны.

person michaeltwofish    schedule 25.02.2012
comment
Привет, извините за некро, мой запрос не работает с именами полей. Например, если slug был в обеих таблицах, одна с заглавной S, другая со строчной s, строчная s может быть указана через table.slug, но прописная S показывает только table2. IE: SELECT table.slug, table вместо SELECT table.slug, table2.slug. Я предполагаю, что это связано с функцией человеческого перевода, которую имеет литий? - person ton.yeung; 10.04.2012
comment
Это похоже на литиевую ошибку. Проверьте проблемы литиевого github, и если они еще не существуют, откройте проблему и прикрепите неудачный тестовый пример. - person michaeltwofish; 11.04.2012
comment
Ваша ссылка API в пункте № 2 была взломана какой-то SEO-компанией (EDIT: на самом деле обе ссылки). - person mopsyd; 28.01.2016
comment
Спасибо, mopsyd, я удалил ссылки и стал немного грустнее в Интернете. - person michaeltwofish; 08.02.2016

Если вы установили отношения (используя hasOne, hasMany или ownTo), вы можете получить связанные данные, указав ключ with в параметрах вашего вызова find.

Так:

$categories = Categories::find('all', array(
  'with' => 'Products'
));

Подробности см. в руководстве, посвященном отношениям.

person benzado    schedule 22.02.2012
comment
Хотя верно то, что отношения будут управлять соединениями вместо вас, неверно говорить, что произвольные соединения невозможны. - person michaeltwofish; 25.02.2012
comment
Круто, я удалил это из своего ответа. - person benzado; 26.02.2012