Laravel-admin 表单保存一对多关联数据(源码探究到功能实现)
我的个人博客:逐步前行STEP
由于Laravel-admin只支持表单保存一对一关联数据,要想保存一对多关联数据,还得从了解它的源码入手,看有没有空子可钻。
首先,进入源码中的Form.php的store函数中看它是怎么保存表单数据的:
public function store()
{
//为了节省篇幅,就省略无关代码吧
......
DB::transaction(function () {
//这里是保存表单中当前模型的数据
$inserts = $this->prepareInsert($this->updates);
foreach ($inserts as $column => $value) {
$this->model->setAttribute($column, $value);
}
$this->model->save();
//这里是保存表单中关联模型数据
$this->updateRelation($this->relations);
});
......
}
然后进入到保存关联模型数据的updateRelation函数中:
protected function updateRelation($relationsData)
{
foreach ($relationsData as $name => $values) {
if (!method_exists($this->model, $name)) {
continue;
}
$relation = $this->model->$name();
//在这里判断了关联关系是否是一对一关联、一对一多态关联,不是的话就无法进行后续处理了
$oneToOneRelation = $relation instanceof Relations\HasOne
|| $relation instanceof Relations\MorphOne
|| $relation instanceof Relations\BelongsTo;
$prepared = $this->prepareUpdate([$name => $values], $oneToOneRelation);
if (empty($prepared)) {
continue;
}
......
}
额,所以必须使用一对一关联关系来保存数据,即将本来是一对多的关系写一个一对一的关联关系用户保存数据,比如:user模型中又一个friends一对多关联模型,但是为了在表单中保存一个friends数据,创建一个friend一对一关联关系在表单中用户保存关联数据。