4

私は動作するクエリビルダーを持っています:

        $article = Page::where('slug', '=', $slug)
                     ->where('hide', '=', $hidden)
                     ->first();

ただし、hiddenが1に等しい場合は、2番目のwhereステートメントのみを追加したいと思います。以下のコードを試しました。これは、実行しようとしていることのロジックを示していますが、機能しません。

$article = Page::where('slug', '=', $slug);
if ($hidden == 1) {
    $article->where('hide', '=', 1);
}
$article->first();

私はLaravel4を使用していますが、問題はLaravel3にも当てはまると思います。

4

1 に答える 1

8

ええ、Eloquentとクエリビルダーにはちょっとした「落とし穴」があります。以下のコードを試してください;)

$query = Page::where('slug', '=', $slug);

if ($hidden == 1) {
    $query = $query->where('hide', '=', 1);
}

$article = $query->first();

条件内での$queryの割り当てに注意してください。これは、(静的に呼び出された)条件内のクエリオブジェクトに別のオブジェクトを返す最初の場所であるためです。これを回避する1つの方法は、最近のコミットにより、次のようになっていると思います。

$query = Page::where('slug', '=', $slug)->query();

これによりクエリオブジェクトが返され、通常どおりに実行できます($ queryを再割り当てする代わりに)。

お役に立てば幸いです。

于 2013-02-05T22:09:41.480 に答える