2017-01-18 16 views
0

私はLaravel Projectにhttps://github.com/nicolaslopezj/searchableを使用しています。関連レコードに基づくlaravelコレクションの結果をフィルタ

私はユーザーとの関係が多岐にわたるホテルオブジェクトを持っています。

私はこれを使用して関係を照会できます。

protected $searchable = [ 
    'columns' => [ 
     'hotels.nombre' => 10 
    ], 
    'joins' => [ 
     'hotel_user' => ['hotels.id' , 'hotel_id'], 
     'users' => ['hotel_user.user_id', 'users.id'] 
    ] 
]; 

検索では、私はいくつかの特定のユーザーに属するすべてのホテルをフィルタリングするこのような何か(JSON形式)

[ 
    { 
    "id": 3, 
    "nombre": "Paradisus Playa del Carmen La Esmeralda", 
    "url_foto": "uploads/hotel/3/1484747239.jpg", 
    "website_url": "https://www.melia.com/es/hoteles/mexico/playa-del-carmen/home.htm", 
    "updated_at": "2017-01-18 13:47:44", 
    "relevance": 60, 
    "users": [ 
     { 
     "id": 1, 
     "first_name": "Alex", 
     "last_name": "Angelico", 
     "formatted_name": "Alex", 
     "company": "ConexionBIZ", 
     "title": "Director", 
     "picture_url": "https://media.licdn.com/mpr/mprx/0_FIUn3Wf5E4OMEwzR5feW3o7IoRSveSkR5W7d3oxczOM5BdPUwDws7EIJXvDEIE5c6HMeaSSFgb19", 
     "created_at": "2017-01-17 12:00:00", 
     "updated_at": "2017-01-18 13:50:19", 
     "pivot": { 
      "hotel_id": 3, 
      "user_id": 1, 
      "created_at": null, 
      "updated_at": null 
     } 
     } 
    ] 
    }, 

を返します。 私が試した:

$result = \App\Hotel::search($request->get('q'))->with([ 
      'users' => function($q) use ($user_id) { 
       $q->where('users.id', '<>', $user_id); 
      }, 
     ])->get(); 

をしかし、これは、関連するユーザーなしでホテルを返します。私はホテルから(ユーザーだけでなく)結果を削除する必要があります。

どうすればいいですか?

ありがとうございます!

答えて

1

コレクションが取得され、遅延読み込みに使用された後に、with()メソッドは実際には2番目のクエリとして実行されます。

あなたが探しているのは、whereHas()です。これは、関連するモデルに基づいて現在のモデル結果をフィルタリングします。 $user_idと一致していないユーザーを持つすべてのHotelモデルを返します

$result = \App\Hotel::search($request->get('q')) 
    ->whereHas('users', function($q) use ($user_id) { 
     $q->where('users.id', '<>', $user_id); 
    }) 
    ->get(); 

あなたも、その後のユーザーをロードする必要がある場合:

$result = \App\Hotel::search($request->get('q')) 
    ->with('users') 
    ->whereHas('users', function($q) use ($user_id) { 
     $q->where('users.id', '<>', $user_id); 
    }) 
    ->get(); 

$user_idに一致していない、少なくとも1人のユーザーを持つすべてのHotelモデルが、$result->first()->usersコレクションはまだそのIDを持つユーザーを含めることができますロードします。 $user_idを持っている任意のHotelモデルを返さないために、関連、コレクション内の任意のユーザーを返さないためにあなたは、両方の方法組み合わせることになります。

$result = \App\Hotel::search($request->get('q')) 
    ->with(['users' => function($q) use ($user_id) { 
     $q->where('users.id', '<>', $user_id); 
    }]) 
    ->whereHas('users', function($q) use ($user_id) { 
     $q->where('users.id', '<>', $user_id); 
    }) 
    ->get(); 
+0

素晴らしいが、おかげでたくさん –

+0

ところで、私はLaravelに新たなんだと私は持っています良い文書を見つけるのが難しい。 Laravelのサイトは私には不十分だと思われますが、Laracastは始動には良いものでしたが、今はLaravel 5.3についての適切な文書や文献についてアドバイスをしていますか? TKS! –

+0

私の知識の大半は、Laravelのドキュメントにあります。彼らのドキュメントを徹底的に一度読んで、より高いレベルの概要を得ることをお勧めします。そうすれば、ドキュメンテーションがそれをカバーするかどうかの一般的なアイデアを得ることができます。基本的に「ラーベール」という命名規則を学ぶと、ドキュメントの移動が容易になります。あなたにも質問があるなら、私を打つように気をつけてください。私はいつも仲間の開発者を喜んで支援しています!乾杯! –

関連する問題