Laravel数据库查询中对 like 的值进行转义
龙行PHP-8-205500评论
在laravel开发中,如果我们用到like模糊搜索$where[]=['title','like','%'.$data['title'].'%'];
上面这种在laravel中会报数据错误。
参考各种实例,可以这样做functionlike_str($str)
{
$like_escape_char='!';
returnstr_replace([$like_escape_char,'%','_'],[
$like_escape_char.$like_escape_char,
$like_escape_char.'%',
$like_escape_char.'_',
],$str);
}
先用函数对keyword进行处理避免%和_把所有数据查出来
然后如下使用$query->where('title','like',"%".like_str($keyword)."%");
或者还可以使用trait<?php
namespaceApp\Models\Traits;
traitLikeScope
{
/**
*@param\Illuminate\Database\Eloquent\Builder$query
*@param$column
*@param$value
*@param$side
*@param$isNotLike
*@param$isAnd
*@return\Illuminate\Database\Eloquent\Builder
*/
publicfunctionscopeLike($query,$column,$value,$side='both',
$isNotLike=false,$isAnd=true)
{
$operator=$isNotLike?'notlike':'like';
$escape_like_str=function($str){
$like_escape_char='!';
returnstr_replace([$like_escape_char,'%','_'],[
$like_escape_char.$like_escape_char,
$like_escape_char.'%',
$like_escape_char.'_',
],$str);
};
switch($side){
case'none':
$value=$escape_like_str($value);
break;
case'before':
case'left':
$value="%{$escape_like_str($value)}";
break;
case'after':
case'right':
$value="{$escape_like_str($value)}%";
break;
case'both':
case'all':
default:
$value="%{$escape_like_str($value)}%";
break;
}
return$isAnd?$query->where($column,$operator,$value):
$query->orWhere($column,$operator,$value);
}
publicfunctionscopeOrLike($query,$column,$value,$side='both',
$isNotLike=false)
{
return$query->like($column,$value,$side,$isNotLike,false);
}
publicfunctionscopeNotLike($query,$column,$value,$side='both',$isAnd=true)
{
return$query->like($column,$value,$side,true,$isAnd);
}
publicfunctionscopeOrNotLike($query,$column,$value,$side='both')
{
return$query->like($column,$value,$side,true,false);
}
}
如下使用<?php
useApp\Models\Traits\LikeScope;
useIlluminate\Database\Eloquent\Model;
classMyModelextendsModel
{
useLikeScope;
publicfunctionscopeSearch($query,$keyword)
{
return$query->like('title',$keyword);
}
}
评论一下
赞助站长
赞助站长X
版权申明:此文如未标注转载均为本站原创,自由转载请表明出处《龙行博客》。
本文网址:/375.html