2017-07-18 1 views
1

私は、指定されたすべてのサービスIDを持つユーザーのリストを返すAPIエンドポイントで作業しています。私の場合は

  • ユーザーは多くのサービスを持つことができます
  • テーブル: 'ユーザー'、 'サービス'、 'service_user'

私はにVueのJSを経由して配列を渡していますが例えば私のエンドポイント:

/endpoint/32,35,38 

私のクエリは現在、次のとおりです。

$servicesArray = explode(',', $services); 

$users = User::whereHas('services', function ($query) use ($servicesArray) { 
      foreach ($servicesArray as $key => $value) { 
       $query->where('id', $value); 
      } 
     }) 
     ->get(); 

問題は、ユーザーが正しいサービスを持っていても、今すぐ結果を返すようだということです。私の関係は問題ありません。エンドポイントにサービスを1つだけ渡すと、そのサービスが割り当てられているユーザーが正しく返されます。以前はwhereInを使用しましたが、エンドポイント配列で指定されたすべてのサービスを持つユーザーのみを表示する必要があります。

私が持っているものが予想どおりに動作しない理由は何ですか?

+0

@BenRoobただし、配列値のいずれかが一致するすべての結果が返されます。私はすべての配列のフィールドが一致しているところだけを返す必要があります。 – Lovelock

+0

申し訳ありませんが、本当にそれを逃した...私はたわごとを削除します! – BenRoob

答えて

1

私はこのような何かをしようとするだろう:

$q = User::query(); 

foreach ($servicesArray as $key => $value) { 
    $q->whereHas('services', function ($query) use ($value) { 
     $query->where('id', $value); 
    }); 
} 

$users = $q->get(); 
+0

興味深いアイデアは、 "Illuminate \ Database \ Eloquent \ Builderクラスのオブジェクトを文字列に変換できませんでした"ということです。 – Lovelock

+0

元のクエリでは、3つすべてのIDを持つ1つのサービスを検索しようとしているようです。答えのアイデアは、1つのIDで3つのサービスを検索する必要があるということです。アイデアが明確かどうかは分かりませんが、それは私がやろうとしていることです。 – Laerte

+0

あなたのアイデアを使って解決しましたが、微調整されました。問題は、私のクエリに '$ query'のような名前をつけてから$ users = $ query-> get()を返す必要があることでした。 – Lovelock

0

また、他のテーブルから複数のレコードを取得するためlaravelのhasManyののrealationship機能を使用することができます。

例:

---のようなあなたのコントローラの使用クエリで。

$users = User::with('services')->where('id', $value)->get(); 

---モデルのクラスでは、次のような関数サービスを使用します。

function services(){ 
    return $this->hasMany('App\Service','user_id','id'); 
} 
関連する問題