2013-06-04 3 views
2

У меня есть DQL запрос типа:Доктрина, бежать имя переменного поля в DQL

$em->createQuery(" 
    SELECT r 
    FROM WeAdminBundle:FamilyRelation r 
    WHERE r.col like :query 
") 

Теперь я хочу изменить «седловину» в зависимости от различных параметров. Как я могу достичь этого с помощью DQL, так как обычный setParameter здесь не работает.

ответ

1

Вкратце: вы не можете так, как хотите.

Для этого вам нужно что-то вроде $dql->setColumn(array('variable_column' => 'some_column_name')) просто как bindColumn метода от PDO, но нет эквивалентного метода (bindColum или setcolumn) в Учении.

2

Вы можете использовать setParameter с DQL, как many examples are provided, но для предложений LIKE убедитесь, что переменная обернута в %.

$em->createQuery(" 
    SELECT r 
    FROM WeAdminBundle:FamilyRelation r 
    WHERE r.col like :query 
")->setParameters(array(
    'query' => '%'.$foo.'%' 
)) 
+0

Да, для параметра для аналогичного предложения оно работает, но не для имени столбца r.col. – Johni

+0

Извините, я неправильно понял ваш вопрос. Вы имеете в виду, что 'r.col' становится чем-то вроде' r.foo' в зависимости от того, что вы установили? –

+0

Да (сущность «r» не изменяется, но поле «col») – Johni

0

Для использования различных параметров вместо седловине смотрите ниже пример:

$var = "r.col"; 

Здесь могут изменяться в зависимости от состояния.

$em->createQuery(" 
    SELECT r 
    FROM WeAdminBundle:FamilyRelation r 
    WHERE ".$var." like :query 
") 

, пожалуйста, посмотрите.

+0

Пункт дезинфекции запроса состоит в том, чтобы самостоятельно деактивировать $ var, чего вы здесь не делаете. если $ var поступает с пользовательского ввода, это полностью уязвимо. – Frug

Смежные вопросы