2016-07-13 6 views
4

最近、Laravelがバージョン5.3をリリースしました。Laravel 5.3 - orWhereで始まるクエリビルダー

次のリンクで5.2から5.3にいくつかのアップグレード手順があります。 https://laravel.com/docs/5.3/upgrade#upgrade-5.3.0

雄弁スコープは、現在のスコープ制約の主要なブールを尊重するが。たとえば、orWhere制約を使用してスコープを開始する場合、これはもはやnormalに変換されません。この機能に頼っている場合(ループ内に複数のorWhere制約を追加するなど)、最初の条件がブール論理問題を回避する通常の条件であることを確認する必要があります。

範囲がwhere拘束で始まる場合は、何も処理する必要はありません。

これは物事を少し難しくするように見えますが、アップグレードでは制限が加えられるだけであることを覚えておいてください。

私たちは内部パッケージを持っており、コードをシンプルかつ可能な限りきれいに保つために、orWhere()で問合せを開始する部分があり、これを再帰的な内部のクロージャの概念と同様に使用します方法。ご存知のように、再帰的な方法は、短く簡単にするのが最善です。

今アップグレードノートによると、それがために必ず誰もがこの動作が削除されている理由に理由を知っていれば私は思っていたLaravel 5.3

に失敗しますか?

ありがとうございます!

更新:

私はLaravel 5.3上で、当社のシステムを移行しました。私はこれがEloquent Builderでのみ影響を受け、Query Builder(以前は "Fluent Builder")では影響を受けていないことを確認します。

Eloquent \ Builderだけでもコミットされています(これは大変です)。 https://github.com/laravel/framework/issues/14829

とにかく、安全な側にするために、それに応じて調整することをおすすめします。それは私たちがしたことですが、今日のように私たちのコードを壊さなかったことは分かっています。

+1

私はこれがより明確になると思います。私はあなたがそれが常に真実である最初のものを使うことができると思って、あなたのorwheresと鎖をつけて同じ行動をとることができると思います。 – Hammerbot

+0

ええ、私はそれをすることができると理解しています。ちょうどそれはいくつかの余分な行を追加します(私はそれがたくさんではないことは分かっていますが)。しかし、私はその柔軟性を取り除くポイントが何であるか疑問に思っていただけです。このような大きなコミュニティに直面しているフレームワークのために行動を取り除くのは厄介です。この動作は、CodeIgniterのアクティブレコードでも機能します。私はそれがCIのようなものだと信じていますが、Doctrineについてはわかりません。 –

答えて

6

私は理由が正確なこのプルリクエストであると考えている:

orActive範囲は、次のように定義されている場合

User::approved()->orActive(); 

その場合の:https://github.com/laravel/framework/pull/12918

誰かがこのようなスコープを使用したいです

public function scopeOrActive($q) { 
    return $q->orWhere('active',1) 
} 

およびapprovedスコープは、次のように定義されます。

Laravel 5

where approved = 1 AND active = 1 

と中:

public function scopeApproved($q) { 
    return $q->where('approved',1) 
} 

laravel 5.2では、それはに解決します。3それはに解決されます:それはしかし、私はここでorWhere

+0

ありがとうMarcin!私はあなたが正しいと信じて、それが変化の理由かもしれない。それは厄介ですが、このケースでは動作しますが、別のケースでは動作しません。 システムの設計上の制限は問題ではありますが、最終的な開発者の恩恵を受けています。私がちょうど言ったことに誰かが私を攻撃するかどうかわからない、ハハハ、それは私の最後からちょうど柔らかい考えです。 –

+0

@ThomasCheng私の意見では、この変更は意味がありますが、この使用法は非常に限定されています。あなたは 'orWhere'で始まるスコープを持っていましたか?コード例を表示できますか? –

+0

@MarcinNabiałek - 同じ種類の投稿にお答えください - https://stackoverflow.com/questions/45031207/laravel-5-2-orwhere-generate-and-in-query? –

0

で始まるスコープを使ったことがない理にかなって

where approved = 1 OR active = 1 

ブール値を持つ複数のorWhere句を使用する方法です。

select * from users =アクティブな場合は、(user_type = 1またはuser_type = 2またはuser_type = 3)と入力します。

しかし、必ずしもすべてのuser_typesをクエリに入れる必要はありません。つまり、存在する必要があるかどうかを判断するブール値があります。これは次のようにすることができます:

$includeOne = true; 
$includeTwo = false; 
$includeThree = true; 
$query = User::where('active', 1) 
    ->where(function($q) use ($includeOne, $includeTwo, $includeThree) { 
     $q->when($includeOne, function($query) { 
      return $query->orWhere('user_type', 1); 
     }) 
     ->when($includeTwo, function($query) { 
      return $query->orWhere('user_type', 2); 
     }) 
     ->when($includeThree, function($query) { 
      return $query->orWhere('user_type', 3); 
     }); 
    })->get();