Php Laravel中批量更新关系的最佳实践

Php Laravel中批量更新关系的最佳实践,php,laravel,relationship,Php,Laravel,Relationship,哪一种是批量更新关系的最佳实践 例如,我有一个Post模型,它有这样的关系:列表(多对多)、标签(多对多变形)、作者(一对一)。编辑Post时,我想附加几个列表,几个标签,并设置作者id 简单方法: $post->fill($request->all); $post->saveOrFail(); $post->lists()->sync($request->lists); $post->tags()->sync($request->tags); 不错,但如果关系超过两个,例如10。嗯,不太好。

哪一种是批量更新关系的最佳实践

例如,我有一个
Post
模型,它有这样的关系:
列表
(多对多)、
标签
(多对多变形)、
作者
(一对一)。编辑
Post
时,我想附加几个
列表
,几个
标签
,并设置
作者id

  • 简单方法:
  • $post->fill($request->all);
    $post->saveOrFail();
    $post->lists()->sync($request->lists);
    $post->tags()->sync($request->tags);
    
    不错,但如果关系超过两个,例如10。嗯,不太好。也许我错了

  • 艰难的道路:
  • $post->fill($request->all);
    $post->saveOrFail();
    $post->MassUpdateRations($request->only(['lists','tags']);
    函数massUpdateRelations($data)
    {
    $this->massFill($data);
    $this->massave();
    }
    函数massFill($data,$model=null)
    {
    $uses=array_flip(类_使用_递归(static::class));
    $relationModels=[];
    如果(为空($model)){
    $model=$this;
    }
    如果(!$model->wasnrecentlycreated){
    $relationModels[]=$model;
    }
    foreach($name=>$value形式的数据){
    if(是_数组($value)){
    $relationInfo=$model->{$name}();
    如果($relationInfo实例of belongTomany){
    $relationInfo->sync($value);
    }elseif($relationInfo instanceof HasMany){
    $this->aftermassave[]=函数()使用($relationInfo,$value){
    $relationInfo->delete();
    $relationInfo->createMany($value);
    };
    }elseif($relationInfo实例,用于HasOne){
    $this->aftermassave[]=函数()使用($relationInfo,$value){
    $relationInfo->delete();
    $relationInfo->create($value);
    };
    }否则{
    $relation=$model->{$name};
    $relationModels=array_merge($relationModels,$this->massFill($value,$relation));
    }
    }否则{
    如果($model->isfilled($name)){
    $model->setAttribute($name,$value);
    }
    }
    }
    $this->relationModels=$relationModels;
    返回$relationModels;
    }
    函数massave()
    {
    foreach($this->relationModels作为$relationModel){
    $relationModel->save();
    }
    foreach($this->aftermass另存为$item){
    调用用户函数($item);
    }
    }
    
    也许对很多关系都有好处,但看起来很糟糕。并且在验证关系数组数据时遇到问题


    我试图在我的问题中寻找答案,但没有效果。

    我认为你在1)中描述的很好。如果它变得更复杂,也许可以看一看,特别是在这个例子中,你会看到一些事件,比如创建、更新。。。开箱即用。通过观察者,您可以执行以下操作:

    class PostObserver
    {
        public function updated(User $user)
        {
            // Make appropriate updates on lists and tags here
        }
    }