Просто посмотрите на фактический сгенерированный запрос (проверьте журнал запросов СУБД или попробуйте 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())))
Смотрите также
Спасибо, есть много большой информации здесь, но когда я пытаюсь запрос, я получаю эту ошибку: «сообщение»: «вызов функции члена FUNC() на null " – bstras21
Я был бы очень удивлен, если бы эта ошибка действительно произошла с точным кодом выше, поскольку значение, переданное во второй аргумент закрытия, -' $ this'. Если бы это было «null», это означало бы, что сам объект, вызывающий функцию, не существует (я уже видел более странные причуды в PHP). В любом случае, не видя всего кода, stacktrace, зная точную версию CakePHP, я ничего не могу сделать для вас здесь, в комментариях. @ bstras21 – ndm
На самом деле это была моя ошибка в орфографии. Ваш код действительно сработал, спасибо! – bstras21