Drupal 7 - db_select: функция SQL, в которой условие

T. Maxx спросил: 28 марта 2018 в 04:08 в: sql

Мне нужно использовать это условие в моей инструкции select:

WHERE YEAR(date) = YEAR(CURDATE()) 

, но если я это сделаю, сделайте следующее:

$query = db_select('table', 't');
$query->fields('t');
$query->condition('YEAR\(date\)', 'YEAR(CURDATE())', '=');

У Drupal его не будет (даже если я не убегу от этих скобок - он просто игнорирует их), потому что я получаю сообщение об ошибке:

Column not found: 1054 Unknown column 'YEARdate' in 'where clause':

Как преодолеть эту ошибку?

3 ответа

Есть решение
T. Maxx ответил: 28 марта 2018 в 04:16

Хм ... просто так, кажется:

$query->where('YEAR(date) = YEAR(CURDATE())');

where допускает произвольный SQL:

Метод where () позволяет добавлять произвольный SQL как условный фрагмент. $ snippet может содержать любой допустимый фрагмент SQL, и если он имеет переменное содержимое, он должен быть добавлен с использованием именованного заполнителя. Массив $ args - это массив заполнителей и значений, которые будут подставлены во фрагмент. Разработчик должен убедиться, что фрагмент является допустимым SQL. Никаких специфичных для базы данных изменений во фрагменте не производится.

Fky ответил: 30 марта 2018 в 01:07
Используйте addExpression, смотрите мой пост
Ben Cassinat ответил: 30 марта 2018 в 11:44

Хм, вы также можете использовать db_query, это позволит вам писать SQL-запросы"без Drupal". Я имею в виду, вы сможете добавлять собственные операторы WHERE или любые собственные функции SQL, такие как пользовательские функции;)

Например.

$result = db_query('SELECT title FROM {node} WHERE type = "%s" AND title LIKE "%%%s%%"', 'type', 'title');

Fky ответил: 30 марта 2018 в 01:05

Используйте метод addExpression: https://api.drupal.org/api/drupal/includes! database! select.inc/function/SelectQuery%3A%3AaddExpression/7.x

$query = db_select('table', 't');
$query->fields('t');
$query->addExpression('YEAR(t.date) = YEAR(CURDATE())');
$result = $query->execute()->fetchAll();var_dump($result);