Агрегатные функции Propel Query и Mysql: нельзя использовать синтаксис по умолчанию (<column> =?, Значение) внутри фильтра - PullRequest
0 голосов
/ 21 февраля 2012

У меня проблемы с созданием условий запроса в Propel 1.6 с использованием функций даты Mysql, таких как:

$query = PostQuery::create()->where('YEAR(Post.PublishedAt) = ?', $year)->find();

Следующие работы:

$query = PostQuery::create()->where('YEAR(Post.PublishedAt) = 2011')->find();

Но чтобы обработать переменную $ year, мне нужно написать что-то вроде:

$query = PostQuery::create()->where(sprintf('YEAR(Post.PublishedAt) = %d', $year))->find();

что кажется неправильным.

Я также попытался указать тип параметра, добавив: PDO :: PARAM_INT const:

$query = PostQuery::create()->where('YEAR(Post.PublishedAt) = ?', $year, PDO::PARAM_INT)->find();

Это не работает.

UPD: ошибок нет. В результате пустая коллекция.

Кто-нибудь может мне помочь? Заранее спасибо.

1 Ответ

0 голосов
/ 21 февраля 2012

Согласно OP

// works
PostQuery::create()->where('YEAR(Post.PublishedAt) = 2011')->find();

// doesn't work
PostQuery::create()->where('YEAR(Post.PublishedAt) = ?', $year)->find(); 

Это указывает на то, что PDO заключает в кавычки переменную $ year, поэтому при использовании параметров

PostQuery::create()->where('YEAR(Post.PublishedAt) = \'2011\'')->find();

выполняет следующие действия. Как подробно описано в этом отчете об ошибкахhttps://bugs.php.net/bug.php?id=44639

Выполните любую из этих работ

PostQuery::create()->where('YEAR(Post.PublishedAt) = CONVERT(?,UNSIGNED)', $year,PDO::PARAM_INT)->find();

или (это немного чище)

settype($year,'int');
PostQuery::create()->where('YEAR(Post.PublishedAt) = ?', $year,PDO::PARAM_INT)->find();

Кажется немного идиотским, чтобы делать это таким образомно он должен преобразовать числовую строку в MySQL UNSIGNED INT, подходящий для оператора WHERE.В любом случае, вышеприведенное либо MySQL преобразует его в числовой тип в явном виде, либо, альтернативно, пытается убедиться, что PHP явно имеет тип INTEGER, прежде чем связывать его.

...