2017-08-08 60 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))'))