laravel 查询生成器:连接依赖于主要内容
Posted
技术标签:
【中文标题】laravel 查询生成器:连接依赖于主要内容【英文标题】:laravel query builder: join dependent on primary content 【发布时间】:2018-01-16 07:38:34 【问题描述】:我正在使用 luman 和 Database Query Builder 从数据库中获取完整的用户信息。
首先,请锁定我的数据库结构:
我有一个名为 users
的表和一系列与用户组相关的其他表(例如:secretaries
、patients
、doctors
和 admins
),它们存储有关用户的其他信息。
此外,为了确定用户访问权限,我在 user
表上有一个 level
列,它可以将以下值之一作为枚举:'admin', 'doctor', 'secretary', 'patient'
。
所以,我想使用join
和select
的one 查询来获取此信息。
我的训练代码是这样的:
$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
来自user
表上的level
列,GROUP_TABLE_NAME
可以基于GROUP_NAME
值(例如:['secretary' => 'secretaries' , 'patient' => 'patients' , ...]
)。
任何想法使用 laravel 查询构建器处理连接结构?
【问题讨论】:
看看多态关系laravel.com/docs/5.4/… 【参考方案1】:首先您应该意识到,这种代码架构对于其他开发人员来说并不方便且不易理解。
SQL
您可以使用union
和join
来实现您的目标。
只需将此查询转换为 laravel builder 或直接与 DB::statement
一起使用:select 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))'))
【讨论】:
以上是关于laravel 查询生成器:连接依赖于主要内容的主要内容,如果未能解决你的问题,请参考以下文章
Laravel 查询生成器 order by 不适用于左连接