Как сделать объединенный запрос в интерфейсе таблиц ZF? - PullRequest
1 голос
/ 11 сентября 2009

У меня есть БД, и мои таблицы выглядят так:

альтернативный текст http://img15.imageshack.us/img15/2568/stackdijag.png

То, что я хочу сделать, - это получить все модели, в которых столбец с названием производителя начинается с A. Это означает, что эта простая часть запроса должна быть похожа на $ developers-> fetchAll ("name LIKE '$ letter%'");

Я пытаюсь добиться этого с помощью отношений ZF, но это не происходит, поэтому любая помощь приветствуется ...

1 Ответ

4 голосов
/ 14 сентября 2009
$models = new Models();
$select = $models->select(Zend_Db_Table::SELECT_WITH_FROM_PART);
$select->setIntegrityCheck(false)
       ->join(array("a"=>"manufacturers"), 'models.manufacturer_id = a.id',
         array("man_name"=>"name", "man_description"=>"description"))
       ->where("a.name LIKE 'A%'");
$rowset = $models->fetchAll($select);

К сожалению, интерфейс отношений Zend_Db_Table не обладает достаточным интеллектом, связанным с созданием объединенных запросов из объявленной карты ссылок. Решением сообщества для сложных запросов является фабрика запросов Zend_Db_Table_Select.

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

Но в вашем случае я бы пропустил интерфейс таблицы и интерфейс выбора и просто выполнил бы запрос SQL напрямую, используя адаптер Db:

$data = $db->fetchAll("
  SELECT m.*, a.name AS man_name, a.description AS man_description
  FROM Models m JOIN Manufacturers a ON m.manufacturer_id = a.id
  WHERE a.name LIKE 'A%'");

Вы получите данные в виде простого массива ассоциативных массивов, а не Zend_Db_Table_Rowset. Но поскольку объединенный набор строк в любом случае недоступен для записи, вы не сильно пожертвовали.

...