TP8写法:
$result = Db::name('users')
->whereRaw("FIND_IN_SET($roleId, roles)")
->select();
$result = Db::name('users')
->where(function ($query) use ($roleId) {
$query->whereRaw("FIND_IN_SET($roleId, roles)");
})
->select();
$result = Db::name('users')
->where(function ($query) use ($roleId) {
$query->whereRaw("FEND_IN_SET($roleId, roles)");
})
->where('status', 'active')
->select();
模型类中使用
namespace app\model;
use think\Model;
class User extends Model
{
public function getUsersByRoleId($roleId)
{
return $this->where(function ($query) use ($roleId) {
$query->whereRaw("FIND_IN_SET($roleId, roles)");
})->select();
}
}
// 在控制器中调用模型方法
$userModel = new \app\model\User();
$roleId = 3;
$users = $userModel->getUsersByRoleId($roleId);
foreach ($users as $user) {
// 处理查询结果
var_dump($user);
}
原生写法:
FIND_IN_SET(str,strlist)函数 它不同于 like 模糊查询,它是以“,”来分隔值
str 要查询的字符串
strlist 字段名 参数以”,”分隔 如 (1,2,6,8)
查询字段(strlist)中包含(str)的结果,返回结果为null或记录
下面举例说明
test表中有如下字段及值
下面我想查询area中包含”1″这个参数的记录
SELECT * from test where FIND_IN_SET('1',area)
返回值
下面查询btype字段中包含”15″这个参数的值
SELECT * from test where FIND_IN_SET('15',btype)
返回值
FIND_IN_SET和like的区别
like是广泛的模糊匹配,字符串中没有分隔符,Find_IN_SET 是精确匹配,字段值以英文”,”分隔,Find_IN_SET查询的结果要小于like查询的结果。
举个例子来说:
有个文章表里面有个type字段,他存储的是文章类型,有 1头条,2推荐,3热点,4图文 .....11,12,13等等
现在有篇文章他既是 头条,又是热点,还是图文,
type中以 1,3,4的格式存储.
们我们如何用sql查找所有type中有4图文标准的文章呢??
这就要我们的find_in_set出马的时候到了.
以下为引用的内容:
select * from article where FIND_IN_SET('4',type)