field中操作方法

  • group_concat可以进行field内数据分组
->field("id,group_concat(nickname) as name")
  • group_concat中 增加DISTINCT关键字 可以进行分组数据去重
->field("id,group_concat(DISTINCT nickname) as name")
  • group_concat中 separator 可指定分隔符
group_concat(name separator '_')

group_concat需要注意:

  1. 长度限制:

在TP5.0的链式操作中,使用field方法进行查询时,group_concat函数的长度是有限制的。这个限制是由数据库的配置参数决定的,具体取决于数据库的版本和配置。

在MySQL数据库中,group_concat函数的默认最大长度是1024个字符。如果你的查询结果超过了这个长度限制,你可以通过修改数据库的配置参数来增加限制。具体的配置参数名称和修改方法可能会因数据库版本和配置而有所不同。

  1. 顺序对齐:

在同时分组多个字段时
例如:

->field("group_concat(DISTINCT m.name) as m_name,group_concat(DISTINCT m.id) as m_id")

可能会出现循环使用explode切割,并需要对齐的时候,这时应加入order by,否则可能不对齐
如:

->field("GROUP_CONCAT(DISTINCT m.name ORDER BY m.id) AS m_name, GROUP_CONCAT(DISTINCT m.id ORDER BY m.id) AS m_id")

  • 可以在field内做if判断
->field("if(sex=1,'男','女')")
  • 可以在field内做switch判断
->field((CASE WHEN school=1 THEN '小学'
            WHEN school=2 THEN '初中'
            WHEN school=3 THEN '高中'
            WHEN school=4 THEN '大学'
            ELSE '未读书' END) as education)
  • field内做count统计
->field("count(name) as name_count")
  • 做条件判断增加字段
->field("CONCAT_WS( ',',
    CASE WHEN zd.a= '' THEN '这个是a条件' ELSE '没了啦' END,
    CASE WHEN zd.b= '' THEN '这个是b条件' END,
    CASE WHEN zd.c= '' THEN '这个是c条件' END
) AS '遗漏部分'")

where

  • where中find_in_set用法(某字段包含某职)
->where('find_in_set("'.$old.'",old)')
  • where中查询前切割
->where("n.id = CAST( SUBSTRING_INDEX( h.hitsid, '-', - 1 ) AS UNSIGNED )")

使用了 MySQL 的内置函数 SUBSTRING_INDEX 来获取 h.hitsid 字符串中最后一个 - 后面的数字部分,然后使用 CAST 函数将其转换为无符号整数。最后,将 n.id 与这个转换后的值进行比较,以进行匹配。

根据结果数量排序

->field('test, count(*) as count')
->orderRaw('count(*) DESC')

注意事项

  1. 数据库中存的关键字要以英文","分隔
  2. 存储数据要对分隔符进行处理,保证以英文","分隔关键字

where条件添加mysql方法

->where("n.id = CAST( SUBSTRING_INDEX( h.hitsid, '-', - 1 ) AS UNSIGNED )")

order中处理时间格式

假设要按照字段create_time进行排序,但字段格式为Y-m-d H:i:s,需要先转换为时间戳再进行排序

->orderRaw("UNIX_TIMESTAMP(create_time) desc")

在上面的代码中,我们使用orderRaw方法来在order方法中先处理字段格式,再进行排序。通过使用UNIX_TIMESTAMP函数将字段create_time转换为时间戳,然后按照时间戳进行排序。
请注意,orderRaw方法可以接受任意的原生SQL语句作为参数,因此你可以根据实际需求进行更复杂的字段格式处理和排序操作。

orderRaw排序相关

orderRaw方法允许在查询中使用原始的SQL语句作为排序条件

根据id字段值在$arr数组中的顺序进行排序:

->orderRaw("FIELD( id , $arr )")