代码之家  ›  专栏  ›  技术社区  ›  Ross

翻译查询以使用Zend_Db_Select

  •  7
  • Ross  · 技术社区  · 17 年前

    我在翻译这个查询以使用ZF时遇到了一些问题 Zend_Db_Select :

    SELECT b.id, b.title, b.description 
    FROM memberships AS m
    JOIN blogs AS b ON b.id = m.blog_id 
    WHERE m.user_id = ? 
    ORDER BY m.created
    LIMIT 0, 30
    

    (此查询有效并返回结果)

    Memberships 是以下之间的链接表 blogs users 这很简单 | id | blog_id | user_id | 事件。

    以下是我目前所掌握的:

    // $table = Zend_Db_Table instance, $id = a user id
    $select = $table->select()
    ->from(array('m' => 'memberships'), array('b.id', 'b.title', 'b.description'))
    ->join(array('b' => 'blogs'), 'b.id = m.blog_id')
    ->where('m.user_id = ?', (int) $id)
    ->order('m.created DESC')
    ->limit(0, 30);
    

    这是我遇到的((对我来说)奇怪的)错误:

    #0: Select query cannot join with another table

    发生在第211行 D:\...\library\Zend\Db\Table\Select.php .

    谢谢你的帮助。

    2 回复  |  直到 5 年前
        1
  •  15
  •   Aaron    17 年前

    您仍然可以使用传统的$模型->通过添加setIntegrityCheck(false)来选择()对象,如下所示。

    $select = $table->select()
    ->setIntegrityCheck(false)
    ->from(array('m' => 'memberships'), array('b.id', 'b.title', 'b.description'))
    ->join(array('b' => 'blogs'), 'b.id = m.blog_id')
    ->where('m.user_id = ?', (int) $id)
    ->order('m.created DESC')
    ->limit(0, 30);
    

    这将禁用引发异常的检查:

    #0: Select query cannot join with another table
    
        2
  •  9
  •   cg.    17 年前

    当从表对象中检索时,我认为语句将仅限于该表。这个 Zend_Db_Table::select() 方法返回a Zend_Db_Table_Select object是的子类 Zend_Db_Select 并施加了这种限制。请尝试以下操作:

    $db = Zend_Db::factory( ...options... );
    $select = new Zend_Db_Select($adapter);
    $select->from( 'my_table_name' )->join( ...
    

    如果你愿意,以下内容应该是等效的:

    $db = Zend_Db::factory( ...options... );
    $db->select()->from( 'my_table_name' )->join( ...
    
    推荐文章