2017-08-08 54 views
1

我正在使用luman和Database Query Builder從數據庫中獲取完整的用戶信息。laravel查詢生成器:加入依賴於主要內容

首先,請在我的數據庫結構以鎖: 我有一個表稱爲users和一系列其他表的使用有關的用戶羣體(例如:secretariespatientsdoctorsadmins)用於存儲有關的其他信息用戶。

此外,要確定用戶訪問,我有user表中的level列,它可以有一個值爲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_NAME來自level列上user表,並可以基於該GROUP_NAME值建成GROUP_TABLE_NAME(例如:['secretary' => 'secretaries' , 'patient' => 'patients' , ...]) 。

任何想法來處理使用laravel查詢生成器的連接結構?

+0

查看多態關係https://laravel.com/docs/5.4/eloquent-relationships#polymorphic-relations –

回答

0

首先,您應該意識到這樣的事實,即此代碼架構不便於其他開發人員理解並且不易理解。

SQL 您可以通過使用unionjoin實現自己的目標。

只需將此查詢轉換成laravel構建器,或者將其直接與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=?一起使用。

這樣做是爲了在兩個查詢,這兩個索引和快速獲取信息的最簡單方法:用戶從users按主鍵,然後通過信息索引字段user_id在裏面。創建Doctorinfo,Admininfo模型和對應的遷移。因此,用戶類可以是水木清華這樣的:

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))'))