批量更新关系的最佳做法是什么?
例如,我有一个Post
模型,它具有以下关系:Lists
(很多对很多),Tags
(很多对多变种),Author
(一个一)。编辑Post
时,我想附加几个Lists
,几个Tags
并设置author_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->massUpdateRelations($request->only(['lists', 'tags']));
function massUpdateRelations($data)
{
$this->massFill($data);
$this->massSave();
}
function massFill($data, $model = null)
{
$uses = array_flip(class_uses_recursive(static::class));
$relationModels = [];
if (is_null($model)) {
$model = $this;
}
if (!$model->wasRecentlyCreated) {
$relationModels[] = $model;
}
foreach ($data as $name => $value) {
if (is_array($value)) {
$relationInfo = $model->{$name}();
if ($relationInfo instanceof BelongsToMany) {
$relationInfo->sync($value);
} elseif ($relationInfo instanceof HasMany) {
$this->afterMassSave[] = function () use ($relationInfo, $value) {
$relationInfo->delete();
$relationInfo->createMany($value);
};
} elseif ($relationInfo instanceof HasOne) {
$this->afterMassSave[] = function () use ($relationInfo, $value) {
$relationInfo->delete();
$relationInfo->create($value);
};
} else {
$relation = $model->{$name};
$relationModels = array_merge($relationModels, $this->massFill($value, $relation));
}
} else {
if ($model->isFillable($name)) {
$model->setAttribute($name, $value);
}
}
}
$this->relationModels = $relationModels;
return $relationModels;
}
function massSave()
{
foreach ($this->relationModels as $relationModel) {
$relationModel->save();
}
foreach ($this->afterMassSave as $item) {
call_user_func($item);
}
}
对于许多关系来说可能都是好的,但看起来很糟糕。并存在验证数据关系数组的问题。
我正在尝试搜索问题的答案,但没有效果。