Я пытаюсь добавить 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 ,
Есть ли способ сделать это? Любая помощь будет принята с благодарностью, спасибо.
Это ужасный, ужасный хак, чтобы получить не запрограммированный 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`');
Все кредиты принадлежат "Kani" из http://mogura.in/blog/2011/06/17/cakephp-1-3-sql_calc_found_rows.
Я нашел способ реализовать это с помощью торта, встроенного в функции.
$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()']);
Возможно, вы можете указать свой параметр поля, как показано ниже:
'fields'=>array('SQL_CALC_FOUND_ROWS *','COUNT(`Entity`.`id`) as `entity_count`')
Вы можете посмотреть cakephp paginate, используя 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 (дублирующиеся таблицы), поэтому вам необходимо использовать метод объединения в качестве альтернативы для Containable" .