MySQL查询到Zend DB选择

时间:2012-10-31 09:15:05

标签: php mysql zend-framework zend-db-select

我有一个MySQL标准查询,我需要将其转换为Zend_Db_Select,但我无法让它工作。

我收到此错误:

Select query cannot join with another table

以下是查询:

// THE COUNTER
$subselect = $this->table->select()->from(
        array('x' => 'blog_comments'),
        array('x.post_id', new Zend_Db_Expr('count(*) as comments')))
    ->group('post_id');
// THE TOTAL SELECT
$select->from(array('p' => 'blog_posts'), array('p.*'))
       ->setIntegrityCheck(false)
       ->joinLeft(array(
           'x' => $subselect,
           'x.post_id = p.id', 
           array()
           )
       );

如果有人可以转换它,那就太棒了,因为我需要select()模式,因为我使用Zend_Pagination

对于那些想要完整PHP函数的人:Pastebin和堆栈跟踪:Pastebin

4 个答案:

答案 0 :(得分:1)

您可能需要:setIntegrityCheck(false) - 审核:http://framework.zend.com/manual/1.12/en/zend.db.select.html了解更多信息

$select = $this->select()
->from(params) 
->setIntegrityCheck(false) 
->joinLeft(params)
->where(params);

答案 1 :(得分:1)

正如Michael已经提到的,您需要setIntegrityCheck(false)才能使用Zend_Db_Select与其他表进行联接。

Error 1064有点含糊不清,包含各种查询语法问题。所以我建议你将子查询包装在括号中:

$select->setIntegrityCheck(false)
    ->from(array('p' => 'blog_posts'), array('p.*'))
    ->joinLeft(array(
        'x' => new Zend_Db_Expr("({$subselect})"), 
        'x.post_id = p.id', 
        array()
    ));

如果 不能正常工作,那么您的子选择一定有问题。试试echo $subselect;,它会调用__toString() magic method并向您显示您的查询。

答案 2 :(得分:1)

Expression是Count(*)语句,而不是整个子查询。

$subselect = $this->table->select()->from(
    array('x' => 'blog_comments'),
    array('x.post_id', new Zend_Db_Expr('count(*) as comments'))
)->group('post_id');

$select->from(array('p' => 'blog_posts'), array('p.*'))
    ->joinLeft(array(
        'x' => $subselect,
        'x.post_id = p.id', 
        array()
    ));

我不确定你真的需要一个子查询。无论从一个简单的连接开始,还是在它上面构建。

//getGateway = whatever method used to access the database adapter.
//SetIntegrityCheck(false) locks the tables from writes allowing tables to be joined
$select = $this->getGateway()->select()->setIntegrityCheck(false);
$select->from('blog_posts');//default $cols = *
$select->join('blog_comments', 'blog_comments.post_id' = 'blog_posts.post_id');//does it really matter what kind of join you use? They all work the same so use whichever you like.
$select->group('blog_comments.post_id');

一旦您使用默认值进行查询,您可以对其进行优化,直到它按照您的需要运行。

如果您正在进行查询以使用paginator,则count()表达式是无用的,因为paginator会对每个查询应用限制和偏移量。

您也可以考虑反向执行此查询。您最好不要加入另一个方向,或者只在评论表上执行查询。没有看到你的结构的其余部分,这很难说。

祝你好运。

答案 3 :(得分:0)

我终于以另一种方式做到了。

我在视图中使用CMW_Model_Comments来获取帖子ID的评论数量。

// IN MY VIEW
echo $this->commentor->getCommentCount($post->id);

// IN MY CONTROLLER
$cmt = new CMW_Model_Comments();
$this->view->commentor = $cmt;

完美无缺!