调用 unsetRelation() 时不会删除关系

Relation is not removed when calling unsetRelation()

unsetRelation('relation') 在调用 pluck('relation')

时没有被删除
$data = Model::with([
        'child', 'child.one', 'child.two'
])->get()

移除 'child.one' 和 'child.two' 但保留 child

$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。我想如果我们在 pluck 方法之后调用 unsetRelation 不应该 return 吗?

如果我们在 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');

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

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

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

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

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