我正在使用 luman 和 Database Query Builder从数据库中获取完整的用户信息。
首先,请锁定我的数据库结构:
我有一个名为 users
的表和一系列与用户组相关的其他表(例如:secretaries
、patients
、doctors
和 admins
),它存储有关用户的附加信息。
此外,为了确定用户访问权限,我在 user
表上有一个 level
列,它可以具有以下值之一作为枚举:'admin', 'doctor ', '秘书', '病人'
.
因此,我想通过join
和select
使用一个 查询来获取这些信息。
我的训练代码是这样的:
$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' => '患者' , ...]
).
有使用 laravel 查询构建器处理连接结构的想法吗?
最佳答案
首先您应该意识到这样一个事实,即这种代码架构对于其他开发人员而言不方便且不易理解。
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');
}
build 者
您也可以使用左连接来连接所有子表。以下构建器选择 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))'))
关于php - laravel 查询生成器 : join dependent on primary content,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45573315/