2017-01-14 10 views
3

Я пытаюсь запросить запрос текущего месяца, вот мой запрос:Как сравнить месячные части двух дат?

$clients = $this->Clients; 
    $query = $clients->find(); 

    if($this->Auth->user('role') !== 'admin'){ 
     $query->where(['user_id =' => $this->Auth->user('id')]); 
     $query->where(['MONTH(dob) = ' => 'EXTRACT(month FROM (NOW()))']); 

     $query->order(['dob' => 'ASC']); 

    } 

возвращает 0 записей (мое поле типа дата), однако этот запрос в PHPMyAdmin работает:

SELECT * FROM `clients` WHERE MONTH(dob) = EXTRACT(month FROM (NOW())) 

Что я делаю неправильно?

ответ

1

Просто посмотрите на фактический сгенерированный запрос (проверьте журнал запросов СУБД или попробуйте DebugKit), он будет выглядеть по-другому, так как значение правой стороны в наборе условий key => value может быть привязано к параметру/литье/цитирование/побега. В вашем случае это будет рассматриваться как строка, поэтому условие будет наконец выглядеть примерно так:

WHERE MONTH(dob) = 'EXTRACT(month FROM (NOW()))' 

Это будет, конечно, ничего не совпадает.

Вы можете передать весь фрагмент SQL как одно значение массива или как объект выражения, таким образом он будет вставлен в запрос как есть (не вставляйте значения пользователя таким образом, чтобы создать уязвимость SQL-инъекции !), но я бы предложил вместо этого использовать переносные выражения функций.

CakePHP поставляется с функциями выражения для EXTRACT и NOW, так что вы можете просто сделать что-то вроде:

use Cake\Database\Expression\IdentifierExpression; 
use Cake\Database\Expression\QueryExpression; 
use Cake\ORM\Query; 

// ... 

$query->where(function (QueryExpression $exp, Query $query) { 
    return $exp->eq(
     $query->func()->extract('MONTH', new IdentifierExpression('dob')), 
     $query->func()->extract('MONTH', $query->func()->now()) 
    ); 
}); 

кажется немного сложным, но это стоит того, это кросс СУБД портативный, а также автоматическое цитирование совместимый , Сгенерированный SQL будет выглядеть как

WHERE EXTRACT(MONTH FROM (dob)) = (EXTRACT(MONTH FROM (NOW()))) 

Смотрите также

+0

Спасибо, есть много большой информации здесь, но когда я пытаюсь запрос, я получаю эту ошибку: «сообщение»: «вызов функции члена FUNC() на null " – bstras21

+0

Я был бы очень удивлен, если бы эта ошибка действительно произошла с точным кодом выше, поскольку значение, переданное во второй аргумент закрытия, -' $ this'. Если бы это было «null», это означало бы, что сам объект, вызывающий функцию, не существует (я уже видел более странные причуды в PHP). В любом случае, не видя всего кода, stacktrace, зная точную версию CakePHP, я ничего не могу сделать для вас здесь, в комментариях. @ bstras21 – ndm

+0

На самом деле это была моя ошибка в орфографии. Ваш код действительно сработал, спасибо! – bstras21