我的个人博客:逐步前行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一对一关联关系在表单中用户保存关联数据。

标签: none

添加新评论