【问题标题】:Filter collections Laravel过滤集合 Laravel
【发布时间】:2018-05-07 19:06:31
【问题描述】:

有没有办法过滤 Laravel 上数据库查询返回的集合?

返回的集合是这个

 1 => Person {#310 ▼
      #table: "person"
      #attributes: array:15 [▼
        "name" => "Jon Doe"
        "timeavailable" => "1,2,3,4,5,6,7,8"
 2 => Person {#310 ▼
      #table: "person"
      #attributes: array:15 [▼
        "name" => "Jon Moe"
        "timeavailable" => "1,2,5,7,8"

在这里,我要过滤timeavailable 属性。我只想显示 1,2,3 的结果。有没有办法过滤这个集合,所以我只能得到这样的东西

1 => Person {#310 ▼
      #table: "person"
      #attributes: array:15 [▼
        "name" => "Jon Doe"
        "timeavailable" => "1,2,3"
 2 => Person {#310 ▼
      #table: "person"
      #attributes: array:15 [▼
        "name" => "Jon Moe"
        "timeavailable" => "1,2"

因此,过滤后的集合将只有 1,2,3 包含。

【问题讨论】:

  • 一种方法是在查询中使用FIND_IN_SET mysql 函数。其次是使用回调来过滤函数,您可以在其中爆炸timeavailable 并查看其中的项目是否符合您的条件。第三种方法是改进你的数据库设计,所以Person 将有很多 TimeAvailable
  • 您是否要从您的集合中删除 Person 实例,这些实例的 timeavailable 字段中没有 1、2 和 3?在此示例中,John Moe 将被删除(具有 1 和 2,但没有 3)并且John Doe 仍将存在(具有 1、2 和 3)。还是您想实现其他目标?

标签: php laravel eloquent


【解决方案1】:

我认为这不是最好的解决方案,但它可以成为解决此问题的一种方法。检查这是否有帮助...

尝试使用Collectionmap。在内层函数中可以爆破、相交、爆破timeavailable

$limiter = [1,2,3];
$filtered = $array->map(function($person, $k) use ($limiter) {
    $ex = explode(',', $person->timeavailable);
    $intersect = array_intersect($limiter, $ex);
    $person->timeavailable = implode(",",$intersect);
    return $person;
});

这对于小的结果可以正常工作,但如果您打算运行这个有很多结果,它会很慢。

【讨论】:

    猜你喜欢
    • 2018-04-16
    • 1970-01-01
    • 2017-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-12
    • 2014-01-22
    • 2017-09-04
    相关资源
    最近更新 更多