【问题标题】:Filter a Laravel collection without returning a copy过滤 Laravel 集合而不返回副本
【发布时间】:2015-11-02 19:56:28
【问题描述】:

我正在尝试通过匹配某些值来删除我的 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);
});

但是我认为这个分配删除了集合和关系本身之间的链接,因为我在保存模型时开始收到 No such Column 错误:

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() 吗?或者有没有办法将集合重新链接到关系?

【问题讨论】:

    标签: php laravel


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 看起来它会在第一次迭代中删除除第一个匹配项之外的所有项,然后在下一次迭代中删除所有其他项。另外,这还返回数组的副本,而不修改原始数组。我错过了什么吗?
    • 以前从未使用过intersect,我想念你的问题。以为您不想修改原始集合。对不起。我在文档中唯一能看到修改集合的是forget() 方法,但它通过它的键从集合中删除一个项目
    猜你喜欢
    • 2019-12-25
    • 1970-01-01
    • 1970-01-01
    • 2017-01-05
    • 2018-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多