过滤Laravel集合而不返回副本


Filter a Laravel collection without returning a copy

我正试图通过匹配某些值来删除laravel关系集合中的项。问题与答案有一对多的关系。

在你问之前,这些删除需要在内存中完成,然后存储到数据库中(这样我们就可以做一些验证工作。)

因此,我正在使用关系对象给我的Collection:

$this->answers->filter(function($answer) use ($answer_ids_to_remove){
  return !in_array($answer['id'], $answer_ids_to_remove);
});

但是Collection::filter返回一个副本,并且不修改现有集合。所以我尝试了这个:

$this->answers = $this->answers->filter(function($answer) use ($answer_ids_to_remove){
  return !in_array($answer['id'], $answer_ids_to_remove);
});

然而,我认为这个赋值删除了集合和关系本身之间的链接,因为我在保存模型时开始出现"无此类列"错误:

General error: 1 no such column: answers (SQL: update "questions" set "answerswers" = {"1":{"id":"72","question_id":"117","text":"Answer 2","order":"1"},"2":{"id":"73","question_id":"117","text":"Answer 3","order":"2"},"3":{"text":"Answer 4","question_id":117,"order":3}}, "updated_at" = 2015-11-02 19:18:31 where "id" = 117)

事实上,它正试图将其转换为JSON,这表明由于赋值的原因,它不再识别一对多关系。

我可以对原始集合运行filter()吗?或者有没有一种方法可以将集合重新链接到关系?

尝试在集合上使用intersect方法,如:

foreach($answer_ids_to_remove as answer) {
    $this->answers->intersect($answer)
}

使用集合本身,而不是构建一个要删除的答案id数组。

http://laravel.com/docs/5.1/collections#method-与相交