Laravel 集合 - 多个 where 条件

Posted

技术标签:

【中文标题】Laravel 集合 - 多个 where 条件【英文标题】:Laravel Collection - multiple where conditions 【发布时间】:2019-02-09 13:24:13 【问题描述】:

有没有办法将多个 where 条件传递到 Laravel 的集合中?我的意思是:

$filters = [['col1', '=', 'val1'], ['col2', '=', 'val2']];
$found = $collection->where($filters)->first();

我知道它适用于 eloquent 查询构建器,但不适用于集合。我知道我可以链接多个 ->where 语句(即使在 foreach 循环中),但我需要拥有原始集合对象,并且克隆它可以工作,但速度不是那么快。

$localCollectionObject = $localCollection->first(function ($value, $key) use ($remoteCollectionObject, $compareColumnNames)  
    foreach ($compareColumnNames as $compareColumnName) 
        if ($value->$compareColumnName != $remoteCollectionObject[$compareColumnName]) 
            return false;
        
    
    return true;
);

这也很好用,但比clone $localCollection 还要慢。

或者我可以以某种方式“重置” where 语句?

我在 foreach 循环中以不同的条件搜索它,这是一个问题。

【问题讨论】:

“克隆”与过滤任何东西有什么关系? 都在foreach循环内,条件不同,所以我需要在原始集合中搜索,没有where 【参考方案1】:

你总是可以使用你自己的闭包和过滤器:

$collection->filter(function ($item) 
   return $item->col1 == 'val1' && $item->col2 == 'val2';
);

【讨论】:

如您所见,我已经尝试过了(首先在这种情况下与过滤器相同),它比克隆慢;) 我想我不明白你的问题......当然它比克隆慢,克隆不需要比较任何东西。您的问题是您只想在找到第一个元素后停止过滤器吗? 我只是问有没有比克隆更快的东西。 但是 clone 只是创建了一个重复的对象,它没有过滤......那你为什么要比较两者呢? 我建议你澄清你的问题,因为标题和第一个陈述似乎与你真正想要的不符。

以上是关于Laravel 集合 - 多个 where 条件的主要内容,如果未能解决你的问题,请参考以下文章

laravel 5.8中的多个Where条件不起作用

LARAVEL 5.8 - 在 foreach 中使用数组的 WHERE LIKE 子句的多个条件没有给出完整的结果

laravel orm where 条件中 mysql函数 怎么用

laravel orm where 条件中 mysql函数 怎么用

如何使用 Laravel Eloquent 创建多个 Where 子句查询?

如何使用 Laravel Eloquent 创建多个 Where 子句查询?