2012-02-29 4 views
1

Посмотрите на этот код:Zend Framework вопрос запрос

$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» будет равно null, потому что оно будет перезаписано вторым значением типа таблицы. Как я могу решить эту проблему?

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

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

+0

$ это -> _ идентификатор не является значением (так что вы не можете -> где ('mab.id =?', $ Это -> _ ID)), это ? –

+0

Нет, он имеет значение, которое присваивается $ this -> _ id в __construct() – Ahmed

ответ

1

Не вдаваясь в подробности того, почему вы держите 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 и разобраться в том, что вам нужно. Хотя это немного странно, что адаптер не пронумеровал конфликтующие имена полей.

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

0

Использование $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')) 
+0

Я знаю, что я могу использовать псевдонимы, но я думал, что может быть решение с одним полем типа – Ahmed

+0

Поскольку столбцы составляют ключи в PHP-массивы, я не вижу, как это может быть возможно, если вы не хотите, чтобы одно поле 'type' было бы одним из двух, которое не является' NULL'. Это возможно, если вы используете MySQL с использованием 'IFNULL' или' COALESCE' (не помните прямо сейчас). – bububaba

Смежные вопросы