php - laravel 查询生成器 : join dependent on primary content

标签 php sql postgresql laravel lumen

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

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

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

因此,我想通过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 来自 user 表的 level 列和 GROUP_TABLE_NAME 可以基于 GROUP_NAME 值构建(例如:['secretary' => 'secretaries' , 'patient' => '患者' , ...]).

有使用 laravel 查询构建器处理连接结构的想法吗?

最佳答案

首先您应该意识到这样一个事实,即这种代码架构对于其他开发人员而言不方便且不易理解。

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');
}

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/

相关文章:

php - 如何在 drupal 7 中连接外部数据库?

php - 输入标签中的换行符,来自 mysql 的数据

sql - PostgreSQL:SELECT WHERE 不到 15 分钟

php - 如何在 Yii 查询中直接使用 MySQL 代码

php - 如何使用 PHP 访问 XML 中的多个相似标签

SQL 迁移脚本 - 嵌套循环

php - 如果行不存在则先更新然后插入(SQL)而不是先检查行是否存在?

sql - 使用 sql 查询在 ms Access 中的两个不同列中添加值

windows - 运行 postgres 容器时出错 "Error response from daemon: invalid mode:/var/lib/postgresql/data."

database - 有额外约束的外键?