2017-02-14 4 views
1

モデルクエリの結果として得られた商品のコレクション($this->products)があり、その属性値の一部でフィルタリングしたい。問題は、Laravelには、モデルを照会するためにEloquentのようなコレクションのためのorWhereのようなメソッドがないということです。また、私はLIKE %{$searching_for}%ワイルドカードを使用したいと思いますし、私は自分のコレクションをフィルタリングするために(もし可能であれば)それを使う方法がわかりません。Laravel 5:コレクションを照会するためのEloquentの 'orWhere'メソッドの代替

これは私が明らかにorWhere方法が存在しないことをExceptionを投げると私のコレクションフィルタリングしようとしたコードです:私は直接モデルを照会したいのですが、私はちょうど$productsを保存

$products = $this->products 
     ->where("field1", "LIKE %{$searching_for}%") 
     ->orWhere("field2", "LIKE", "%{$searching_for}%") 
     ->orWhere("field3", "LIKE", "%{$searching_for}%") 
     ->orWhere("field4", "LIKE", "%{$searching_for}%"); 

をセッションでのコレクション私は必要などこでもそれを使用することができます、私は何とか既存のコレクションをフィルタリングするためのソリューションを探しているので、データベースをあまり頻繁に照会したくありません。

+0

あなたはこのタイプのロジックを自分で書く必要があります。 [collection](https://laravel.com/docs/5.4/collections#available-methods)メソッドを使用します(おそらく ' - > filter'が必要です)。しかし、SQLのような完全なクエリは提供しません。 – devk

+0

'$ this-> products() - >どこで(...) - > orWhere(...) - > get();'を試したことがありますか? '$ this-> products'はプロパティにアクセスしようとしていますが、' $ this-> products() 'は' public function products(){...} 'メソッドにアクセスしようとしています。 –

答えて

1

$products = $this->products->filter(function($product) use ($searching_for) { 
    return strstr($product->field1, $searching_for) || 
      strstr($product->field2, $searching_for) || 
      strstr($product->field3, $searching_for) || 
      strstr($product->field4, $searching_for); 
}) 

それは変数にフィルター処理されたコレクションを割り当てることを確認しています。また、striposの代わりにstrstrを使用していますが、それが問題の原因であるかどうかは疑問です。

+0

これは、 'collect($ this-> products) - > filter()'と '$ this-> products-> filter()'の両方で機能しましたが、 'strstr'で' stripos' 'strstr'は大文字と小文字を区別しますが、' stripos'は大文字と小文字を区別しません。 – Eseth

+1

'strstr'の代わりの' stristr'で動作しましたが、 'stripos'のように大文字小文字を区別しません。私は 'stristr'を使うようになったので、私はあなたの答えを受け入れたものとしてマークします。 – Eseth

4

laravelコレクションのフィルタメソッドを使用してみてください。

collect($this->products)->filter(function($value) use ($search) { 
    return (stripos($value->field1, $search) || 
     stripos($value->field2, $search) || 
     stripos($value->field3, $search) || 
     stripos($value->field4, $search)); 
}); 

ここで、$ searchは検索したい値です。 Saravananが、それはこれを試すことを示唆している方法と同様に

+0

何らかの理由で、検索用語がフィールド値と一致するかどうかにかかわらず、そのコードの結果は空のコレクションになります。コードは私には正しいように見えますが... – Eseth

+0

あなたのコードはほとんど正しいですが、Spholtの答えは私の問題を解決しました。とにかくありがとうございました! – Eseth

関連する問題