Zend Framework查询问题

时间:2012-02-29 20:03:19

标签: php 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'表中,如果是banner-informer,我会使用另一个表 - 'macb'

在此查询中,我选择了横幅的所有必需元素。 只有两个特定表中的一个具有id_banner = mab.id = $this->_id,行,并且每个表都有字段'type'。如果它在第一个表中找到该行,则'type'的值为null,因为它被第二个表'type'值覆盖。我该如何解决这个问题?

最诚挚的问候,艾哈迈德。

P.S。 对不起,如果我的解释很困​​难,我没有很好的英语知识。

2 个答案:

答案 0 :(得分:1)

不详细说明为什么你要为一件事保留2张桌子(横幅)...... 尝试将tablename前置到所选字段:

  $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()来定义您实际想要提取的字段有时会更方便。

答案 1 :(得分: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'))