26

私はCodeIgniterでこれを行うことができます:

$this->db->select();
$this->from->('node');
if ($published == true)
{
    $this->db->where('published', 'true');
}
if (isset($year))
{
    $this->db->where('year >', $year);
}
$this->db->get();

このコードをLaravelで機能するように変換するにはどうすればよいですか?

4

9 に答える 9

17

Laravel 5.2.27の時点で、次のように条件を記述することでチェーンの切断を回避できます。

$query = DB::table('node')
    ->when($published, function ($q) use ($published) {
        return $q->where('published', 1);
    })
    ->when($year, function($q) use ($year) {
        return $q->where('year', '>', $year);
    })
    ->get();

Eloquentを使用するには、交換$query = DB::table('node')するだけNode::ですが、両方の条件が失敗した場合は、データベース/モデルをクエリする前に、またはクエリ自体から他の条件をチェックしない限り、テーブル内のすべてが返されます.

クロージャで使用するには、 と がローカル スコープ内にある必要があることに$published注意してください。$year

マクロを作成すると、より簡潔で読みやすくなります。参照: Laravel のクエリ ビルダーに条件付きで命令を追加する

于 2016-08-19T18:51:20.497 に答える
5

Eloquent を使用する必要がある場合は、次のように使用できます。whereNotNull が最適な使用法であるかどうかはわかりませんが、空のクエリ インスタンスにしたいものを返す別の方法が見つかりませんでした。

$query = Model::whereNotNull('someColumn');
if(x < y)   
    {
        $query->where('column1', 'LIKE', '%'. $a .'%');
    }else{
        $query->where('column2', 'LIKE', '%'. $b .'%');
    }
$results = $query->get();

このようにして、関係は引き続き機能します。たとえば、ビューで引き続き使用できます

foreach($results as $result){
    echo $result->someRelationship()->someValue;
}

この種のものについては、http://daylerees.com/codebright/eloquent-queriesにかなりの量の情報があります。

于 2015-03-08T20:17:55.260 に答える