【问题标题】:Relation is not removed when calling unsetRelation()调用 unsetRelation() 时不会删除关系
【发布时间】:2019-12-20 13:24:47
【问题描述】:

unsetRelation('relation')在调用pluck('relation')时不会被移除

$data = Model::with([
        'child', 'child.one', 'child.two'
])->get()

删除“child.one”和“child.two”,但保留孩子

$data->transform(function ($item, $key) {
    if($key == 1){ //remove the second item
              $item->unsetRelation('child'); //same behavior if we call $item->unsetRelations();  
        }
        return $item;
});

$output = $data->pluck('child');

如果我们在$data->child 下有2 项,则调用pluck 后,第一项包含所有3 个关系(childchild.onechild.two),第二项仅包含child。我猜如果我们调用unsetRelation 不应该在pluck 方法之后返回它?

如果我们在transform 之后调用dd($data),则关系不存在。

更新

$items = Model::with([
    'child',
    'child.one',
    'child.two'
])->get();

$items->transform(function($item, $key) use ($request){

    if($this->filter($item->child, $request)){ //check if need to exclude

        $item->child->param_1 = $item->id; //as example there is more logic

    }else{

        $item->unsetRelation('child');

    }

    return $item;

});

return $items->pluck('child');

【问题讨论】:

    标签: php laravel eloquent lumen laravel-collection


    【解决方案1】:

    当您对作为关系的属性执行 pluck 时,如果该关系不存在,它将被加载。

    对于你的例子,你可以$data = Model::get() 然后$data->pluck('child');你会得到每个的孩子,而不是一个空的集合。

    要删除专门针对集合 pluck 的关系,请将关系设置为空

    $data->transform(function ($item, $key) {
        if($key == 1){ //remove the second item
              $item->setRelation('child', collect([]);
        }
        return $item;
    });
    

    这将使关系标记为已加载,但仍返回空结果。

    【讨论】:

    • 嗨,谢谢你的回答,但我需要根据几个条件删除child 关系,我可以运行filter 并在运行“转换”之后就可以了,但是想做一个循环。
    • 您需要删除数据库中的关系吗?还是仅仅在结果中?您可以在问题中添加完整的代码吗?
    • @Froxz 我没有看到我提出的解决方案的问题。只需将unsetRelation('child') 替换为setRelation('child', collect([])
    • 这会创建空集合,在调用 pluck 之后它们仍然存在。
    • 你期待什么样的结果?如果你采摘 X 个元素,你会得到 X 个结果。
    猜你喜欢
    • 1970-01-01
    • 2014-08-02
    • 2018-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多