laravel 查询生成器:连接依赖于主要内容

Posted

技术标签:

【中文标题】laravel 查询生成器:连接依赖于主要内容【英文标题】:laravel query builder: join dependent on primary content 【发布时间】: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 查询构建器处理连接结构?

【问题讨论】:

看看多态关系laravel.com/docs/5.4/… 【参考方案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))'))

【讨论】:

以上是关于laravel 查询生成器:连接依赖于主要内容的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 使用查询生成器进行嵌套连接查询

Laravel 查询生成器 order by 不适用于左连接

具有多态连接的 Laravel 查询生成器在 SQLite 上不起作用

Laravel 在连接结果上不同,在查询生成器中不起作用

Laravel 查询生成器/如何阻止它添加方 [括号]?

使用 Laravel Query Builder 进行复杂的 MySQL 内连接查询