2017-05-31 16 views
0

私はlaravelの私の最初のプロジェクトに取り組んでいますが、今は検索機能を実行していますが、私はいくつかの左結合を含むクエリを実行しています。laravelでこのクエリを実行するにはどうすればよいでしょうか?

関連するテーブルは、これらの4つであり、クエリは次のとおりです、私が試した何

demo

$searchData = ProfessionalDetail::select('u.id as user_id','u.first_name','u.last_name','u.profile_pic','c.name as city_name','professional_details.avg_ratings') 
    ->join('users as u' , 'u.id', '=' ,'professional_details.user_id') 
    ->join('user_speciality as us' , 'us.user_id', '=' ,'professional_details.user_id') 
    ->join('specialities as sp' , 'sp.id', '=' ,'us.speciality_id') 
    ->join('cities as c' , 'c.id', '=' ,'professional_details.city_id') 
    ->join('users_roles as ur' , 'ur.user_id', '=' ,'professional_details.user_id') 
    ->where(function ($q2) use ($name) { 
     $q2->where('u.first_name' , 'like', '%' . $name . '%') 
     ->orWhere('u.last_name','like', '%'.$name.'%') 
     ->orWhere('u.first_name','like',$name.'%'); 
     ->orWhere('sp.name','like',$name.'%'); 
    }) 
    ->where('ur.role_id' ,'=' , 2) 
    ->paginate($num_per_page); 

    return $searchData;[![demo][1]][1] 

(それが医師である名前または専門で、ユーザーがリストされていることですページ)、専門的な準備ができたら、すべてが順調に進んでいます。しかし、私がユーザによってリストアップしたいときは、左に 'user_speciality'と 'professional_details'を結合させます。これは私にユーザーを何度も返します。例えば

public function testApi(Request $request) 
{ 
    $users = ProfessionalDetail::searchByNameAndSpe("joshi", 10); 
    $i = 0; 
    if ($users) { 
     foreach ($users as $key => $value) { 
      $response["result"][] = $value; 
      $response["total"] = $i++; 
     } 

    } else { 
     return "error"; 
    } 

    return $response; 
} 

戻り値:

{"result":[{"user_id":204,"first_name":"Joshi","last_name":"Mohit","profile_pic":"1495436016.jpg","name":"Skin Specialist","city_name":"Pune","avg_ratings":"0.00"},{"user_id":204,"first_name":"Joshi","last_name":"Mohit","profile_pic":"1495436016.jpg","name":"Heart Specialist","city_name":"Pune","avg_ratings":"0.00"},{"user_id":204,"first_name":"Joshi","last_name":"Mohit","profile_pic":"1495436016.jpg","name":"ENT Specialist","city_name":"Pune","avg_ratings":"0.00"},{"user_id":204,"first_name":"Joshi","last_name":"Mohit","profile_pic":"1495436016.jpg","name":"Kidney Specialist","city_name":"Pune","avg_ratings":"0.00"},{"user_id":204,"first_name":"Joshi","last_name":"Mohit","profile_pic":"1495436016.jpg","name":"Eye Specialist","city_name":"Pune","avg_ratings":"0.00"}],"total":4} 

ジョシが、しかし私は彼が彼以来、「多くに多くの」関係のために何度も返されることを知って、一度だけ登録されていますいくつかの特産品を所有しています。今

demo

、それは専門性と、ユーザーの名前で検索してもらうために、私が知っている唯一の方法は、私が情報を分離する方法は、情報を処理するだろうと思う、左結合を使用することですしかし、私はそれが私に多くのステップをデバッグするために保存されるので非常に感謝する何らかの方法があれば、私はSQLについて多くのことを知らないので、これはクエリで解決できるかどうかを知りたいすべての情報各モデルの

方法

UserSpecialityテーブル

public function users() { 

    return $this->belongsToMany('App\User', 'user_speciality', 'speciality_id', 'user_id'); 
} 

ユーザ

public function userSpeciality() { 
     return $this->belongsToMany('App\Speciality','user_speciality', 'user_id', 'speciality_id'); 
} 

専門

public function users() { 

    return $this->belongsToMany('App\User', 'user_speciality', 'user_id', 'speciality_id'); 
} 

ProfesionalDetailテーブル

public function user(){ 
     return $this->belongsTo("App\User"); 
    } 
+0

あなたはこれらのテーブル用に設定されたモデルを持っていますか? –

+0

それぞれに対応する対応方法がある場合 私は投稿を修正して追加しました –

答えて

0

は、ユーザーIDによってグループ一度試してみる

GROUPBY(USER_ID)

+0

ありがとう、それは仕事です –

関連する問題