2012-01-21 3 views
2

У меня возникла ситуация, когда я хочу собрать запрос выбора Doctrine на основе погоды. Некоторые параметры пусты или нет. Например, если бы была переменная $ slug, которая была необязательной, я бы хотел что-то вроде этого:Добавление предложения WHERE в Doctrine_Query

function get_bio($slug = '') 
{ 
    $q = Doctrine_Query::create() 
     ->from('Bio b'); 

    if (!empty($slug)) 
    { 
      $q .= $q->where('b.slug = ?', $slug); 
    } 
} 

Я знаю, что это не правильный синтаксис, но как мне собрать что-то подобное?

+0

Вы должны взглянуть на Doctrine-х [QueryBuilder] (http://www.doctrine-project.org/docs/orm/ 2.0/о/ссылка/запрос-builder.html). – undefined

ответ

0

Вы обрабатываете объект запроса как строку, а не объект. Попробуйте вместо этого:

function get_bio($slug = '') 
{ 
    $q = Doctrine_Query::create() 
     ->from('Bio b'); 

    if (!empty($slug)) 
    { 
      $q->where('b.slug = ?', $slug); 
    } 
} 

Обратите внимание на вызов $q->where() работает непосредственно на объекте запроса $q, так что вам не нужно присвоить возвращаемое значение к чему-либо (он возвращает ссылку на сам объект запроса, так что вы можете цепные вызовы). Обратите внимание, что если вы планируете добавить несколько статей where, вы, вероятно, захотите использовать andWhere() вместо where().

0

Почему бы вам не сделать только два запроса? По-моему, не имеет смысла, что вы выполняете функцию для этого, но только мое мнение. Я бы сделал это следующим образом:

if ($slug != NULL) { 
$q = Doctrine_Query::create() 
    ->from('Bio b'); 
    ->where('b.slug = ?', $slug); 
} 
else { 
$q = Doctrine_Query::create() 
    ->from('Bio b'); 
} 

Это тоже не тот синтаксис.

+0

К сожалению, в моей ситуации есть 3 параметра. Поэтому для учета всех перестановок мне понадобится довольно много операторов if/else. Кажется более эффективным просто добавить к запросу по необходимости – djt

1

Answer by dtj


Видимо, я был не слишком далеко. Вот правильный синтаксис:

function get_bio($slug = '') 
{ 
    $q = Doctrine_Query::create() 
     ->from('Bio b'); 

    if (!empty($slug)) 
    { 
      $q = $q->where('b.slug = ?', $slug); 
    } 
} 

Как просто, как удаление точки :)

+0

@dtj Технически часть '$ q =' даже не нужна. Если вы просто делаете '$ q-> где (...)', это будет иметь тот же эффект. –

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