2017-08-08 10 views
1

私はlumanとDatabase Query Builderを使用してデータベースから完全なユーザー情報を取得しています。laravel query builder:一次コンテンツに依存して結合する

まず、私のデータベース構造でロックをしてください: 私はテーブルがusersと呼ばれているとユーザグループ(例:secretariespatientsdoctorsadmins)に関連する他の一連のテーブルについての追加情報を格納しますユーザー。

また、私はuserテーブルにlevelカラムを持っています。これは、この値の1つをenum:'admin', 'doctor', 'secretary', 'patient'とすることができます。

のクエリをjoinselectで取得したいと考えています。

私のトレーニングのコードは次のようなものです:

$userInfo = User::where("userID", $userID) 
      ->limit(1) 
      ->join('[GROUP_TABLE_NAME]', function ($join) { 
        $join->on('user.userID', '=', '[GROUP_TABLE_NAME]' .'.'. 
             '[GROUP_NAME]' . 'ID'); 
      }) 
      ->get(); 

GROUP_NAMEuserテーブルの上にlevel列から来ているとGROUP_TABLE_NAMEGROUP_NAME値に基づいて構築することができます(例:['secretary' => 'secretaries' , 'patient' => 'patients' , ...]) 。

laravel query builderを使用して結合構造を処理する方法はありますか?

+0

多型関係を見てください。https://laravel.com/docs/5.4/eloquent-relationships#polymorphic-relations –

答えて

0

まず、このコードアーキテクチャーは他の開発者にとっては便利ではなく、理解しにくいということに注意してください。

SQL あなたはunionjoinを使って、あなたの目標を達成することができます。

laravel builderのこのクエリを変換するか、DB::statementselect users.*, infos.info from users left join ((select secretaries.* from secretaries) UNION (select doctors.* from doctors)) infos ON users.id = infos.user_id where users.id=?で直接使用してください。

しかし

それがインデックス化と高速の両方の2つのクエリで情報を取得することで行う最も簡単な方法:それにインデックスフィールドuser_idにより、主キー、その後の情報でusersからユーザー。 DoctorinfoAdmininfoモデルと対応する移行を作成します。したがって、ユーザークラスは、このようななめらかになります

public function getInfo() { 
    switch($this->level) { 
     'doctor': 
      return $this->doctorinfo; 
     ... 
    } 
} 

private function doctorinfo() { 
    $this->hasOne('App\Doctorinfo'); 
} 

ビルダー

あなたは左の使用だけでなく、すべてのサブテーブルを結合するために参加することができます。次のビルダーはinfo列を選択します。

User::where("userID", $userID)->limit(1) 
    ->leftJoin('patients', 'users.id', '=', 'patients.user_id') 
    ->leftJoin('doctors', 'users.id', '=', 'doctors.user_id') 
    ->leftJoin('admins', 'users.id', '=', 'admins.user_id') 
    ->select('users.*', DB::raw('IF(users.level="admin", admins.info, (IF users.level="doctors", doctors.info, patients.info))')) 
関連する問題