Использование WHERE IN с подготовленными операторами SQL в Propel - PullRequest
3 голосов
/ 04 августа 2011

В системе, над которой я работаю, которая использует Propel для обработки базы данных, я готовлю необработанный запрос, который должен принимать изменяющееся условие WHERE IN.

Простой пример того, что я пытаюсьсделать это:

$c = Propel::getConnection();
$q = $c->prepare("SELECT foo FROM bar WHERE blah IN(:ids)");
$q->execute(array(':ids' => array(1, 2, 3, 4, 5)));

Очевидно, это не работает для меня.Я также попытался использовать implode (',' array (1, 2, 3, 4, 5)) в качестве параметра my:: ids, который также не работает.Первый метод жалуется на необходимость принятия массива, а второй метод жалуется на сравнение строки с целым числом.

Есть ли правильный способ передать массив значений в запрос для WHERE IN?Я не хочу жестко его кодировать, так как это будет означать подготовку к каждой итерации цикла.

Обратите внимание, что у меня нет возможности создать критерий и использовать вместо него doSelect, так какзапрос на самом деле намного сложнее, чем приведенный здесь пример, и я серьезно сомневаюсь, что смог бы построить его таким образом.

Большое спасибо!

Ответы [ 3 ]

1 голос
/ 04 августа 2011

Это обходной путь PDO:

$yourListOfIDs = array(1, 2, 3, 4, 5);

$q = $c->prepare("SELECT foo FROM bar WHERE blah IN(".rtrim(str_repeat('?,', count($yourListOfIDs)), ',').")");

// bindValue starts at 1 (not 0)
foreach ($yourListOfIDs as $key => $val)
{
  $q->bindValue(($key+1), $val);
}

$q->execute();

Осторожно: код не проверен

1 голос
/ 04 августа 2011

Если используемая вами БД - MySQL, возможно, будет работать запрос типа:

SELECT foo FROM bar WHERE FIND_IN_SET(blah, :ids) > 0

.В этом случае вы должны использовать implode(',', array(1, 2, 3, 4, 5)) для значения параметра.Если blah имеет тип int, возможно, вам придется преобразовать его в char, например FIND_IN_SET(CAST(blah AS CHAR), :ids)

0 голосов
/ 04 августа 2011

Нельзя использовать именованный маркер параметра с одним и тем же именем дважды в подготовленном операторе. Нельзя связать несколько значений с одним именованным параметром, например, в предложении IN () оператора SQL.

PDO :: подготовить

Propel использует PDO

Пропеллер

...