Как написать запрос соединения для нескольких таблиц в CakePHP?

может кто-нибудь сказать мне, как получить объединенный результат из нескольких таблиц в cakePHP (используя mcc-архитектуру cakePHP). Например, у меня есть три таблицы для присоединения (tbl_topics, tbl_items, tbl_votes. Их взаимосвязь определяется следующим образом: в теме может быть много элементов, а элемент может иметь много голосов. Теперь я хочу получить список тем с подсчетом все голоса по всем пунктам для каждой темы. SQL-запрос для этого написан ниже:

SELECT Topic.*, count(Vote.id) voteCount FROM tbl_topics AS Topic LEFT OUTER JOIN tbl_items AS Item ON (Topic.id = Item.topic_id) LEFT OUTER JOIN tbl_votes AS Vote ON (Item.id = Vote.item_id); 

Моя проблема заключается в том, что я могу сделать это легко, используя функцию $this->->query , но для этого требуется, чтобы код sql был написан в controllerе, который я не хочу. Я пытаюсь найти другой способ сделать это (например, find() ).

 $markers = $this->Marker->find('all', array('joins' => array( array( 'table' => 'markers_tags', 'alias' => 'MarkersTag', 'type' => 'inner', 'foreignKey' => false, 'conditions'=> array('MarkersTag.marker_id = Marker.id') ), array( 'table' => 'tags', 'alias' => 'Tag', 'type' => 'inner', 'foreignKey' => false, 'conditions'=> array( 'Tag.id = MarkersTag.tag_id', 'Tag.tag' => explode(' ', $this->params['url']['q']) ) ) ))); 

как указано в статье Nate Abel: текст ссылки

Я буду честен здесь и скажу, что вы, вероятно, будете намного счастливее, если просто создадите функцию в своей модели, например getTopicVotes () и вызовите query (). Каждое другое решение, о котором я могу думать, только сделает его более сложным и, следовательно, уродливым.

Редактировать:

В зависимости от размера ваших данных и при условии, что вы правильно настроили свои отношения с образцом (тема hasMany Items hasMany Votes), вы можете сделать простую находку («все»), содержащую все элементы и голоса, а затем сделать что-то вроде это:

 foreach ($this->data as &$topic) { $votes = Set::extract('/Topic/Item/Vote', $topic); $topic['Topic']['vote_count'] = count($votes); } 

Здесь важны две вещи:

  1. Если у вас много данных, вы должны, вероятно, забыть об этом подходе, это будет медленным, как черт.
  2. Я написал это из своей памяти, и это может быть не так, как в реальной жизни, и / или это может не работать вообще 🙂

Вы можете легко установить свойство «recursive» в запросе find ().

 $result = $this->Topic->find('all', array('recursive' => 2)); 

Кроме того, вы можете использовать поведение Containable в своей модели. Затем вы можете использовать:

 $this->Topic->contain(array( 'Item', 'Item.Vote', )); $result = $this->Topic->find('all'); 

или

 $result = $this->Topic->find('all', array( 'contain' => array( 'Item', 'Item.Vote', ), )); 

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

Оба этих решения либо потребуют от вас использования дополнительного кода, либо полагаться на поведение в вашем приложении, но если вы будете сопротивляться искушению написать чистый SQL-код, вы будете вознаграждены тем, что сможете использовать разбивку на страницы Cake, автоматические условия, магия модели и т. д.

Вы должны изучить HaBTM (имеет и принадлежит многим) http://book.cakephp.org/2.0/ru/models/associations-linking-models-together.html

  • Невозможно создать постоянное значение типа В этом контексте поддерживаются только примитивные типы или типы перечислений
  • Обновить подмножество data.table на основе объединения
  • ВЕРНУТЬСЯ ВЕРСИЯ В LINQ
  • Создайте комбинированный DataTable из двух таблиц данных, связанных с LINQ. C #
  • Хороший пример для boost :: algorithm :: join
  • MySQL: быстрое разбиение типов объединений
  • Соединяться между таблицами в двух разных базах данных?
  • Объединить несколько дочерних строк в одну строку MYSQL
  • Join / Where with LINQ и Lambda
  • Mysql выбирает, где не в таблице
  • Как использовать mysql JOIN без условия ON?
  • Давайте будем гением компьютера.