collection 实例(非 ORM 实例)可不可以用 where 方法利用 ‘like’ 模糊查询

事情是这样的,现在我将一个数组转成Collection实例(Illuminate\Support\Collection

$newData = collect($data); //数组变成集合

like查询的两种方式:

$newData = $newData->where('name','like',$dutyName); //全名查询
$newData = $newData->where('name','like','%' . $dutyName . '%'); //模糊查询

结果:

模糊查询返回的数据为空
全名查询可以正常查询出数据

纠结了好长时间,最后得出结论:模糊查询的‘%’可能有问题

//$dutyName是全名的情况下运行下面两行代码:
$newData = $newData->where('name','like',$dutyName);   //可以正常输出数据
$newData = $newData->where('name','like','%' . '$dutyName');  //输出数据为空

很奇怪哎....想问一下如何解决这个问题?

补充:
文档中写到:默认情况下, Eloquent查询的结果返回的内容都是 Collection 实例。

集合实例:Illuminate\Support\Collection
Eloquent实例:Illuminate\Database\Eloquent\Collection

难道只能通过Eloquent实例来模糊查询吗?

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
LDL1023
最佳答案

collection 是不支持 like 查询的

collection where 的源码

public function where($key, $operator, $value = null)
{
    return $this->filter($this->operatorForWhere(...func_get_args()));
}

protected function operatorForWhere($key, $operator, $value = null)
{
       ...

            switch ($operator) {
                default:
                case '=':
                case '==':  return $retrieved == $value;
                case '!=':
                case '<>':  return $retrieved != $value;
                case '<':   return $retrieved < $value;
                case '>':   return $retrieved > $value;
                case '<=':  return $retrieved <= $value;
                case '>=':  return $retrieved >= $value;
                case '===': return $retrieved === $value;
                case '!==': return $retrieved !== $value;
            }
    ...
}

当 operator 不支持时,默认为 "=",

$newData = $newData->where('name','like',$dutyName);   //可以正常输出数据
// 这句代码实际是 $newData->where('name','=',$dutyName); 

Eloquent 实例来模糊查询实际上是数据库的 LIKE 查询

5年前 评论
讨论数量: 4
LDL1023

collection 是不支持 like 查询的

collection where 的源码

public function where($key, $operator, $value = null)
{
    return $this->filter($this->operatorForWhere(...func_get_args()));
}

protected function operatorForWhere($key, $operator, $value = null)
{
       ...

            switch ($operator) {
                default:
                case '=':
                case '==':  return $retrieved == $value;
                case '!=':
                case '<>':  return $retrieved != $value;
                case '<':   return $retrieved < $value;
                case '>':   return $retrieved > $value;
                case '<=':  return $retrieved <= $value;
                case '>=':  return $retrieved >= $value;
                case '===': return $retrieved === $value;
                case '!==': return $retrieved !== $value;
            }
    ...
}

当 operator 不支持时,默认为 "=",

$newData = $newData->where('name','like',$dutyName);   //可以正常输出数据
// 这句代码实际是 $newData->where('name','=',$dutyName); 

Eloquent 实例来模糊查询实际上是数据库的 LIKE 查询

5年前 评论

QueryBuilder的where like是使用数据库查询,至于集合,你先要确定有like这个operator

        switch ($operator) {
            default:
            case '=':
            case '==':  return $retrieved == $value;
            case '!=':
            case '<>':  return $retrieved != $value;
            case '<':   return $retrieved < $value;
            case '>':   return $retrieved > $value;
            case '<=':  return $retrieved <= $value;
            case '>=':  return $retrieved >= $value;
            case '===': return $retrieved === $value;
            case '!==': return $retrieved !== $value;
        }
5年前 评论
LDL1023

collection 是不支持 like 查询的

collection where 的源码

public function where($key, $operator, $value = null)
{
    return $this->filter($this->operatorForWhere(...func_get_args()));
}

protected function operatorForWhere($key, $operator, $value = null)
{
       ...

            switch ($operator) {
                default:
                case '=':
                case '==':  return $retrieved == $value;
                case '!=':
                case '<>':  return $retrieved != $value;
                case '<':   return $retrieved < $value;
                case '>':   return $retrieved > $value;
                case '<=':  return $retrieved <= $value;
                case '>=':  return $retrieved >= $value;
                case '===': return $retrieved === $value;
                case '!==': return $retrieved !== $value;
            }
    ...
}

当 operator 不支持时,默认为 "=",

$newData = $newData->where('name','like',$dutyName);   //可以正常输出数据
// 这句代码实际是 $newData->where('name','=',$dutyName); 

Eloquent 实例来模糊查询实际上是数据库的 LIKE 查询

5年前 评论
ALMAS

这头像是不是跟站长头像重了😂😂😂

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!