Я хочу получить количество строк определенной таблицы с учетом временных рамок.
Я использую CakePHP 3.7.
Здесь вы можете увидеть мой код (из класса контроллера):
public function nbOfDefense($dateIn, $dateOut){
if ($dateIn!=null && $dateFin!=null){
$conditions = array('thesis.date_end BETWEEN ? and ?' => array($dateIn, $dateOut));
$query = $this->Thesis->find('all',
array('conditions'=>$conditions));
die(strval($query->count()));
return $query;
}else{
$query = $this->Thesis->find('all');
die(strval($query->count()));
return $query->count();
}
}
Я тестирую свою функцию через браузер, используя этот URL:
http://локальный:8888/тезис/nbOfDefense/2003-02-01/2019-04-13
Что я хочу, чтобы моя функция делала, так это получить в параметрах две даты:
Если эти две даты не равны нулю, вы получите количество строк между двумя датами с учетом даты, хранящейся в таблице, с которой вы консультируетесь.
Если даты нулевые, вы получите общее количество строк таблицы.
И вернуть целое число, которое представляет собой количество строк между этими двумя датами.
Я чувствую, что проблема здесь в том, как я справляюсь со своим условием, потому что подсчет общего количества строк работает отлично (остальная часть кода).
Ошибка, которую я имею прямо сейчас с этим кодом, следующая:
Невозможно преобразовать значение типа array
в строку
он указывает на эту строку:
die(strval($query->count()));
Я предполагаю, что функция подсчета возвращает массив (странно, потому что это не так, когда я подсчитываю все строки без условий). Я также пробовал это:
die(strval(sizeof($query->count())));
Но я получаю ту же ошибку, что и раньше (не могу преобразовать массив в строку)
Я должен что-то упустить, но я не знаю, что...
Пытаться:
use Cake\ORM\Query;
use Cake\Database\Expression\QueryExpression;
class MyController extend AppController
{
public function nbOfDefense($dateIn = null, $dateOut = null)
{
$query = $this->Thesis->find();
if ($dateIn && $dateOut) {
$query->where(function (QueryExpression $exp, Query $q) use ($dateIn, $dateOut) {
return $exp->between('date_end', $dateIn, $dateOut);
});
}
$count = $query->count();
$this->set(compact('query', 'count'));
}
// ..
}
и читать:
https://book.cakephp.org/3.0/en/orm/query-builder.htmlhttps://book.cakephp.org/3.0/en/orm/retrieving-data-and-resultsets.html
@createurx добавить: use Cake\ORM\Query;
и use Cake\Database\Expression\QueryExpression;
Боже мой! Да, это так, большое спасибо за вашу помощь!
Спасибо за ваш ответ! Когда я пробую ваш код, если даты равны нулю, он работает отлично. Но когда я пытаюсь установить даты (используя URL-адрес или написав $dateIn = "2003-02-01"; в начале моей функции), я получаю сообщение об ошибке: Аргумент 1 передается в App\Controller\ThesisController \::App\Controller\{closure}() должен быть экземпляром App\Controller\QueryExpression, заданным экземпляром Cake\Database\Expression\QueryExpression, вызываемым в .../cake3_7/vendor/cakephp/cakephp/src/ База данных/Query.php. Так что я не уверен, как я могу проверить это