0

我正在尝试将 SQL_CALC_FOUND_ROWS 添加到查询中(请注意,这不是用于分页)

请注意我正在尝试将此添加到 cakePHP 查询中,我目前拥有的代码如下:

return $this->find('all', array(
                'conditions' => $conditions,
                'fields'=>array('SQL_CALC_FOUND_ROWS','Category.*','COUNT(`Entity`.`id`) as `entity_count`'),
                'joins' => array('LEFT JOIN `entities` AS Entity ON `Entity`.`category_id` = `Category`.`id`'),
                'group' => '`Category`.`id`',
                'order' => $sort,
                'limit'=>$params['limit'],
                'offset'=>$params['start'],
                'contain' => array('Domain' => array('fields' => array('title')))
            ));

请注意,'fields'=>array('SQL_CALC_FOUND_ROWS','这显然不起作用,因为它试图将 应用于SQL_CALC_FOUND_ROWS表,例如SELECT类别.SQL_CALC_FOUND_ROWS,

反正有这样做吗?任何帮助将不胜感激,谢谢。

4

4 回答 4

0

这是一个可怕的、可怕的黑客攻击,可以让一个未转义的人SQL_CALC_FOUND_ROWS进入查询,但它确实有效:

$categories = $this->Category->find('all', array(
   'fields' => array('SQL_CALC_FOUND_ROWS 0.0 AS dummy_field,1', 'Category.*', ...),
   'limit'  => 42,
   ...
));
$totalCategories = $this->Category->query('SELECT FOUND_ROWS() as `total_categories`');

所有功劳都来自http://mogura.in/blog/2011/06/17/cakephp-1-3-sql_calc_found_rows的“Kani” 。

于 2011-06-29T07:20:20.990 回答
0

您可能想使用 mysql SQL_CALC_FOUND_ROWS 查看 cakephp 分页。该人的语法与您的语法相似,并且对他有用。

如果这没有帮助,您可以随时使用$this->find('count', $params);http://book.cakephp.org/view/1020/find-count)或$this->query('YOUR SQL QUERY HERE');http://book.cakephp.org/view/1027/query)。

除此之外,您不应'joins''contain'. 根据文档可能导致一些 SQL 错误(重复表),因此您需要使用 joins 方法作为 Containable 的替代方法”。

于 2010-06-02T20:46:16.337 回答
0

也许你可以让你的字段参数如下:

'fields'=>array('SQL_CALC_FOUND_ROWS *','COUNT(`Entity`.`id`) as `entity_count`')
于 2010-06-03T03:13:02.543 回答
0

我找到了一种使用 cake 内置函数来实现它的方法。

$dbo = $this->User->getDataSource();

//buildStatement() creates a Standard SQL Statement
$subQuery = $dbo->buildStatement(
    array(
        'fields' => $fields,
        'table' => $dbo->fullTableName($this->User),
        'alias' => 'User',
        'limit' => null,
        'offset' => null,
        'joins' => array(),
        'conditions' => $conditions,
        'order' => null,
        'group' => null
    ),
    $this->User
);

//Add the SQL_CALC_FOUND_ROWS part
$subQuery = str_replace('SELECT', 'SELECT SQL_CALC_FOUND_ROWS', $subQuery);
$Users = $this->User->query($subQuery);

//Get FOUND ROWS
$foundRows = $this->User->query("SELECT FOUND_ROWS()");
$count = intval($foundRows[0][0]['FOUND_ROWS()']);
于 2010-12-01T09:12:51.263 回答