Согласно 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, прежде чем связывать его.