PHP / Zend Framework: Какой объект будет обрабатывать сложное соединение таблиц? - PullRequest
4 голосов
/ 29 марта 2010

Я думаю, что одна из наиболее сложных концепций, которые нужно понять в Zend Framework, - это то, как шаблон шлюза табличных данных должен обрабатывать объединения нескольких таблиц. Большинство предложений, которые я видел, утверждают, что вы просто обрабатываете соединения, используя $ db-> select () ...

Zend DB Select с несколькими объединениями таблиц
Объединение таблиц с Zend Framework PHP
Объединение таблиц с моделью в Zend Php
Zend Framework Db Выбрать Справка по объединению таблиц
Zend DB Select с несколькими объединениями таблиц

Мой вопрос таков: какой объект лучше всего подходит для обработки этого типа оператора выбора из нескольких таблиц? и таблица БД. Однако помещать его в контроллер кажется неправильным, потому что зачем контроллеру обрабатывать оператор SQL? В любом случае, я чувствую, что ZF делает обработку наборов данных из нескольких таблиц более сложной, чем должна быть. Любая помощь, которую вы можете оказать, великолепна ...

Спасибо!

1 Ответ

5 голосов
/ 29 марта 2010

По определение , Шлюз TableData обрабатывает только одну таблицу.

ZF применяет это определение с проверкой целостности в Zend_Db_Table_Selects. Тем не менее, проверка целостности может быть отключена, а затем вы можете делать соединения. Просто создайте метод внутри вашего класса таблицы, чтобы выполнить соединение через объект select следующим образом:

public function findByIdAndJoinFoo($id)
{
   $select = $this->select();
   $select->setIntegrityCheck(false) // allows joins
          ->from($this)
          ->join('foo', 'foo.id = bar.foo_id');

   return $this->fetchAll($select);
}

Если вы хотите придерживаться определения, вы можете использовать какой-то сервисный уровень или DataMapper , который знает, как обрабатывать несколько таблиц. Они находятся между классами Db и контроллерами.

Другой альтернативой является не использование объединений, а табличные отношения , а затем отложенная загрузка зависимых наборов строк при необходимости. Конечно, это не Joins, а несколько запросов.

И, наконец, вы все еще можете просто использовать Zend_Db_Statement и создавать свой SQL вручную :

  $stmt = $db->query(
              'SELECT * FROM bugs WHERE reported_by = ? AND bug_status = ?',
              array('goofy', 'FIXED'));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...