thinkphp6的join连表查询

发布时间 2024-01-12 23:15:30作者: 天宁哦

说明

join

要关联的(完整)表名以及别名,支持三种写法:

写法1:[ '完整表名或者子查询'=>'别名' ]
写法2:'完整表名 别名'
写法3:'不带数据表前缀的表名'

condition

关联条件,可以为字符串或数组, 为数组时每一个元素都是一个关联条件。

type

关联类型,可以为: INNER、LEFT、RIGHT、FULL,不区分大小写,默认为INNER。

不同前缀

一般情况下,都是一个数据库中查询的,这样的情况下默认使用的都是相同的表前缀,比如(shop_),所以在使用数据库模型关联查询时往往都是这样写的:

Order::alias('o')
     ->join('user u', 'o.user_id = u.id')
     ->select();

在以上代码中,因为是使用模型查询,所以默认都会加上表前缀,两张表的完整表名就是shop_ordershop_user,而关联类型则默认为INNER关联。

但这时如果关联了一张不同前缀的表(比如:pay_record),上述的查询语句显然就行不通了,这时就需要在关联语句处稍作修改,修改后的代码如下:

Order::alias('o')
     ->join(['pay_record' => 'r'], 'o.pay_id = r.id')
     ->select();

这样便能使用模型关联不同前缀的表进行查询了。

总结

上述的方式其实也就是把join函数中的join参数由字符串修改为数组

使用示例

/**获取通知记录列表 */
    public function getlist()
    {
        $params = getParams(['page', 'limit', 'name', 'phone', 'subject']);
        $where = [];
        if (empty($params['page'])) {
            $params['page'] = 1;
        }
        if (empty($params['limit'])) {
            $params['limit'] = 10;
        }
        if (!empty($params['name'])) {
            $where[] = ['u.name', 'like', "%{$params['name']}%"];
        }
        if (!empty($params['phone'])) {
            $where[] = ['u.phone', '=', $params['phone']];
        }
        if (!empty($params['subject'])) {
            $where[] = ['u.subject', '=', $params['subject']];
        }

        // $count = NotificationrecordModel::count();
        // 查询通知表,关联用户表
        $notificationList = NotificationrecordModel::alias('n')
            ->join('user u', 'u.uid = n.uid')
            ->where($where)
            ->order('n.notificationTime', 'desc')
            ->field('n.id,u.name,u.subject,u.phone,n.notificationTime')
            ->page($params['page'], $params['limit'])
            ->select();
        if ($notificationList) {
            // 输出查询结果
            // foreach ($notificationList as $notification) {
            //     echo '用户名:' . $notification->name . '<br>';
            //     echo '通知时间:' . $notification->notificationTime . '<br>';
            //     echo '<br>';
            // }
            return apiReturn(0, '获取成功', $notificationList->toArray());
        } else {
            return apiReturn(1, '暂无数据');
        }
    }