2017-05-27 44 views
2

新しいコレクションにオブジェクトを追加する場合は、一連の異なる結果をループします。コレクションにオブジェクトが既に存在するかどうかを確認する - Laravel

クエリ:次に

$osRed = Item::where('category', 'Hardware') 
     ->where(function ($query) { 
      $query->where('operating_system', 'xxx') 
       ->orWhere('operating_system', 'xxx') 
       ->orWhere('operating_system', 'xxx'); 
     }) 
     ->orderBy('operating_system', 'ASC') 
     ->get(); 

、これらの結果をループして、新しいコレクションに関連するオブジェクトを追加します。

foreach ($osRed as $os) { 
     foreach ($os->services as $service) { 
      if (!($servicesImpacted->contains($service))) { 
       $servicesImpacted->push($service); 
      } 
     } 
} 

次に、別の結果セットに進み、その結果の関連サービスをコレクションに追加します。

しかし、オブジェクトがすでにコレクションに入っていることを認識していないため、重複していると思われるものが多数あります。

理想的には、私は$ serviceオブジェクトのname属性にマッチしたいと思いますが、これはcontainsメソッドでサポートされていないようです。

if (!$servicesImpacted->contains('name', $service->name)) 

それとも、例えば、この場合にはwhere()count()コレクションのメソッドを使用できます:

toString() must not throw an exception 
+0

定義したモデルとリレーションシップを提供できますか? Item :: where(...) - > with( 'services');あなたは次のように書くことができます。 – YanDatsyuk

+0

したがって、 '$ servicesImpacted'はオブジェクトの集合です。右? –

答えて

5

あなたは定義されたキーと値を持つcontains()を使用することができます

if ($servicesImpacted->where('name', $service->name)->count() === 0) 
+0

ありがとう@Alexey 'count()のアプローチでまだtoStringエラーが発生していました。しかし、あなたは私がcontainsメソッドの問題を修正するのを手伝ってくれました。 – kerrin

0

あなたが使用することができます のLaravelのcontains()メソッド値の特定のキーが存在するかどうかを確認します。 特定のキーのコレクションで値を使用できる場合はtrueを返します。

if($collection->contains('product_id',1234)) 
{ 
    echo "product id 1234 available in collection"; 
} 
関連する問題