首页 > 编程语言 >thinkphp6的join连表查询

thinkphp6的join连表查询

时间:2024-01-12 23:23:25浏览次数:35  
标签:join name 查询 连表 params thinkphp6 关联 where

说明

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, '暂无数据');
        }
    }

标签:join,name,查询,连表,params,thinkphp6,关联,where
From: https://www.cnblogs.com/tn666/p/17961776

相关文章

  • Thread 之 join() 方法
    案例代码@Slf4jpublicclassJoinDemo{publicstaticvoidmain(String[]args)throwsInterruptedException{Threadt1=newThread(()->{log.info("{}线程启动",Thread.currentThread().getName());try{......
  • Thread的方法介绍sleep、join、yield、wait、notify、notifyAll
    本文转载自:https://zhuanlan.zhihu.com/p/665014094 一、sleep方法(线程锁)线程释放CPU进入休眠,但不会释放锁(synchronized),释放CPU,不释放锁这里面有个比较经典的用法,代码中循环太快,导致年轻代的GC频繁或者GC时间久,可以通过Thread.sleep(0)释放CPU,让GC线程去执行回收经典用法:线......
  • oracle如何进行复杂的join查询
    在Oracle数据库中,进行复杂的JOIN查询涉及多个表之间的连接,可以使用JOIN子句来实现。以下是一些示例,展示如何在Oracle中执行复杂的JOIN查询:1.内连接(INNERJOIN):SELECTemployees.employee_id,employees.employee_name,departments.department_nameFROMemployeesINNERJOIN......
  • 面试官:MySQL 到底是 join 性能好,还是 in 一下更快呢?被问懵逼了…
    来源:https://juejin.cn/post/7169567387527282701先总结:数据量小的时候,用join更划算数据量大的时候,join的成本更高,但相对来说join的速度会更快数据量过大的时候,in的数据量过多,会有无法执行SQL的问题,待解决事情是这样的,去年入职的新公司,之后在代码review的时候被提出说,不要......
  • 数据库 Mysql 多表查询,left join联合两个sql示例
    SELECTt1.RowID,t1.UserID,t1.CreateDate,t1.BatchState,t2.InputDataCount,t1.QtyFROM(SELECT@curRow:=@curRow+1ASRowID,`UserID`,DATE_FORMAT(CreateDate,'%Y-%m-%d')ASCreateDate,......
  • 企业实战总结:SQL Join执行的常见问题及解决方案
    1.背景SQL的join对于数据开发同学是最经常遇到的操作,通过表与表之间的关联来得到想要的数据。但是在开发中我们会遇到一些莫名奇妙的问题,本文就选择最常见的两类问题跟大家分享。2.结果不符合预期2.1string和bigint做join,出现重复数据这个问题源于底层的隐式转换规则,当string和b......
  • 无涯教程-PostgreSQL - Joins(连接语句)
    PostgreSQLJoins子句用于合并数据库中两个或多个表中的记录,JOIN是一种通过使用每个表的公用值来组合两个表中的字段的方法。PostgreSQL中的联接类型是-CROSSJOININNERJOINLEFTOUTERJOINRIGHTOUTERJOINFULLOUTERJOIN在继续之前,让无涯教程考虑两个表,COMPANY和DE......
  • Hive-mapjoin详解(mapjoin原理)
    笼统的说,Hive中的Join可分为CommonJoin(Reduce阶段完成join)和MapJoin(Map阶段完成join)。本文简单介绍一下两种join的原理和机制。一.CommonJoin如果不指定MapJoin或者不符合MapJoin的条件,那么Hive解析器会将Join操作转换成CommonJoin,即在Reduce阶段完成join。CommonJoin整个......
  • ThinkPHP6 关于事件的简单应用
    一、序章ThinkPHP6的手册中关于【事件】章节的介绍都是直接文字说明,给出创建的类文件,并没有一个好的示例来进行补充说明。对于刚接触【事件】的同学在阅读理解上增加了一点点困难,本文就在此结合示例简单叙述下。 二、事件事件的使用分两种方式,一个是不使用事件类,另一个使用事......
  • mysql union all、union、join
    union和join是需要联合多张表时常见的关联词,join:两张表做交连后里面条件相同的部分记录产生一个记录集,union:union是产生的两个记录集(字段要一样的)并在一起,成为一个新的记录集。二者区别:join和union的主要区别就一条,join是将拼接内容变成一行(左右拼接),根据共同字段将数据拼接成......