cakephp и SQL_CALC_FOUND_ROWS - PullRequest
       18

cakephp и SQL_CALC_FOUND_ROWS

0 голосов
/ 02 июня 2010

Я пытаюсь добавить 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 ]

0 голосов
/ 29 июня 2011

Это ужасный, ужасный хак, чтобы получить незаполненный 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.

0 голосов
/ 03 июня 2010

Может быть, вы можете сделать свой параметр поля, как показано ниже:

'fields'=>array('SQL_CALC_FOUND_ROWS *','COUNT(`Entity`.`id`) as `entity_count`')
0 голосов
/ 01 декабря 2010

Я нашел способ реализовать это с помощью встроенных в торт функций.

$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()']);
0 голосов
/ 03 июня 2010

Вы можете посмотреть на paginate cakephp, используя mysql SQL_CALC_FOUND_ROWS . У человека был такой же синтаксис, как у вас, и он работал на него.

Если это не помогает, вы всегда можете использовать $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 (дублирующимся таблицам), поэтому вам необходимо использовать метод join в качестве альтернативы для Containable ".

...