【问题标题】:laravel query builder: join dependent on primary contentlaravel 查询生成器:连接依赖于主要内容
【发布时间】:2018-01-16 07:38:34
【问题描述】:

我正在使用 luman 和 Database Query Builder 从数据库中获取完整的用户信息。

首先,请锁定我的数据库结构: 我有一个名为 users 的表和一系列与用户组相关的其他表(例如:secretariespatientsdoctorsadmins),它们存储有关用户的其他信息。

此外,为了确定用户访问权限,我在 user 表上有一个 level 列,它可以将以下值之一作为枚举:'admin', 'doctor', 'secretary', 'patient'

所以,我想使用joinselectone 查询来获取此信息。

我的训练代码是这样的:

$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 查询构建器处理连接结构?

【问题讨论】:

标签: php sql postgresql laravel lumen


【解决方案1】:

首先您应该意识到,这种代码架构对于其他开发人员来说并不方便且不易理解。

SQL 您可以使用unionjoin 来实现您的目标。

只需将此查询转换为 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的信息。创建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))'))

【讨论】:

    猜你喜欢
    • 2022-01-20
    • 2014-05-13
    • 2020-03-12
    • 2014-12-06
    • 2016-11-12
    • 2020-06-20
    • 2016-11-16
    • 2015-05-09
    • 2015-11-17
    相关资源
    最近更新 更多