2015-11-02 106 views
0

我试图通过匹配某些值来删除laravel关系集合中的项目。问题与答案有一对多的关系。在不返回副本的情况下过滤Laravel集合

之前你问,这些搬迁需要在内存中后完成并存储到数据库(这样我们就可以做一些东西与验证。)

所以,我用的收集的关系对象给我:

$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 "answers" = {"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()吗?或者有没有办法将收藏重新链接到关系?

回答

0

尝试使用intersect方法的集合,像这样:

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

与其建造答案一组ID删除应用的合集本身。

http://laravel.com/docs/5.1/collections#method-intersect

+0

这看起来像它会删除所有,但第一个匹配项在第一次循环,然后在接下来它会删除所有其他人。另外,它还会返回数组的副本,而不会修改原始数据。我错过了什么吗? – whiterook6

+0

在实际使用之前从未使用'intersect',我想念你的问题。认为你不想修改原始集合。对不起。在修改集合的文档中,我可以看到的唯一一个是'forget()'方法,但它通过其关键字从集合中移除了一个项目 –

相关问题