我正试图通过匹配某些值来删除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-与相交