首页 > 解决方案 > 从已获取的集合中删除父级及其所有子级

问题描述

这是我的桌子的样子:

Cars:
+-------+---------+---------+
| Type  |  Name   |  Brand  |
+-------+---------+---------+
| brand | BMW     | null    |
| brand | Audi    | null    |
| model | X3      | BMW     |
| model | A4      | Audi    |
| model | Picasso | Citroen |
+-------+---------+---------+

如您所见,表中有些型号的品牌未作为单独的记录列出。我还需要将这些包含在我的结果中(并且我不允许将新记录添加到表中,因此我无法添加brand | Citroen | null行)。我的尝试是首先从表中获取所有条目,然后在foreach循环中我将只过滤brand类型的值。对于每个品牌,一旦将其添加到表中,我将删除该记录,Collection但也会删除它的所有子项。这样,剩下的唯一记录$entries将是那些model没有“父”记录的类型:

function filter() {
   $entries = Car::get();
   $result = [];
   foreach($entries as $entry) {
      if($entry->type == 'brand') {
         $result[] = $entry->name;
         //delete $entry and all $entry->models from $entries
      }
   }
   foreach($entries as $entry) {
      $result[] = $entry->brand;
   }   
   return $result;
}

是否可以一次删除一个以上的集合元素?

brand以下是和之间的关系model

class Car {
   public function models() {
      return $this->hasMany(Car::class, 'brand', 'brand')->where('type', 'model');
    }
}

编辑:

这只是我真实代码的简化版本。因此,我没有字符串数组,而是对象数组,我不能添加重复值然后使用array_uniqe. 我实际上是$result用整行填充数组,因为我需要稍后在前端使用它。

标签: laravel

解决方案


我不确定我是否完全理解您的要求。但是,据我了解,您希望过滤从数据库中获取的集合,以便仅将类型为模型的记录留在集合中。

$results = [];

$entries = Car::get()
    ->reject(function($car) {
        return $car->type === 'model';
    })->values()->all();

让我知道我的理解是否正确。


推荐阅读