2012-01-21 16 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/ja/reference/query-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句を追加する予定がある場合は、where()ではなくandWhere()を使用することをお勧めします。

0

なぜ2つのクエリを実行しないのですか?私の意見では、あなたはこのための機能を果たしているのではなく、私の意見だけです。私はこのようにします:

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-> where(...)'だけを実行すると、同じ効果が得られます。 –