Проблема запроса Zend Framework - PullRequest
1 голос
/ 01 марта 2012

Посмотрите на этот код:

$sql = $this->getAdapter()->select()
        ->from(array('mab' => 'module_adv_banner'))
        ->joinLeft(array('mafb' => 'module_adv_filebanner'),'mab.id = mafb.id_banner',array('source','type'))
        ->joinLeft(array('macb' => 'module_adv_contentbanner'),'mab.id = macb.id_banner',array('content','type'))
        ->where('mab.id = ?', $this->_id)
        ->order('position asc');

В этом запросе я использую 3 таблицы.Сначала с 'mab' псевдоним - это главная таблица баннеров.Две другие таблицы 'mafb' и 'macb' являются конкретными таблицами для разных типов баннеров.Если баннер - изображение или swf, он хранится в таблице «mafb», в случае баннера-информера я использую другую таблицу - 'macb'

. В этом запросе я выбираю все необходимые элементы баннера.Только в одной из двух конкретных таблиц есть строка с id_banner = mab.id = $this->_id,, и у каждой из этих таблиц есть поле 'type'.Если он находит эту строку в первой таблице, значение 'type' равно нулю, поскольку оно перезаписывается значением 'type' второй таблицы.Как я могу решить эту проблему?

С наилучшими пожеланиями, Ахмед.

ps извините, если мое объяснение затруднительно, у меня нет хорошего знания английского языка.

Ответы [ 2 ]

1 голос
/ 01 марта 2012

Не вдаваясь в детали того, почему вы держите 2 таблицы для одной вещи (баннеры) ... попробуйте добавить имя таблицы к выбранным полям:

  $sql = $this->getAdapter()->select()
        ->from(array('mab' => 'module_adv_banner'))
        ->joinLeft(array('mafb' => 'module_adv_filebanner'),'mab.id = mafb.id_banner',array('mafb.source','mafb.type'))
        ->joinLeft(array('macb' => 'module_adv_contentbanner'),'mab.id = macb.id_banner',array('macb.content','macb.type'))
        ->where('mab.id = ?', $this->_id)
        ->order('position asc');

Это даст вам 4 поля вместо 2, которые вы можете использовать в PHP и отсортировать то, что вам нужно. Хотя немного странно, что адаптер не совпал с именами полей в пространстве имен.

Кстати, иногда удобнее передать array() в качестве 3-го аргумента join() и использовать columns() для определения полей, которые вы действительно хотите извлечь.

0 голосов
/ 01 марта 2012

Используйте $key => $value запись для создания псевдонимов:

->joinLeft(array('mafb' => 'module_adv_filebanner'),'mab.id = mafb.id_banner',array('mafb.source', 'mafb_type' => 'type'))
->joinLeft(array('macb' => 'module_adv_contentbanner'),'mab.id = macb.id_banner',array('macb.content','macb_type' => 'type'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...