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
}
}