Laravel-admin: 使用hasMany后无法编辑

Created on 24 Mar 2017  ·  14Comments  ·  Source: z-song/laravel-admin

点击编辑框按钮后提示
default

Most helpful comment

laravel-admin 前期无论是二次开发还是底层开发都比较容易,后面越来越麻烦,且优势不大。

首先是局限性太大了,定制成本高。

其次由于之前的规划,现在改一下功能都需要修改到底层。

另外,这种形式的框架做项目后面的优势不明显,牺牲了很多前端的可定制性。

总得来说,小小项目用一下还可以,稍微需要定制的,最好还是自己写。

All 14 comments

定义的关联方法命名用的是驼峰吧?

可以把定义关联的模型的静态属性 $snakeAttributes 设置成 false

同样的问题 #862 ,这里的这个问题很奇怪,如果这里只支持模型内定义的非驼峰关联函数,那么模型内的函数就违规了,这个是什么原因引起的?类似 #165 吗,这里是刻意设计的还是 bug,没有看到原委说明,希望能进行说明。

这个主要是在编辑的时候才会出现, 如果用驼峰的话, HasMany 这个 field 没能拿到值

查看 Encore\Admin\Form::edit()

    public function edit($id)
    {
        $this->builder->setMode(Builder::MODE_EDIT);
        $this->builder->setResourceId($id);

        $this->setFieldValue($id);

        return $this;
    }

查看 setFieldValue()

    protected function setFieldValue($id)
    {
        $relations = $this->getRelations();

        $this->model = $this->model->with($relations)->findOrFail($id);

        // 这里拿到数组(下标转换成snake风格, 可以查看框架源码确认), 给下面让每个 field 自己取到自己的值
        $data = $this->model->toArray();

        $this->builder->fields()->each(function (Field $field) use ($data) {
            $field->fill($data);
        });
    }

查看 Encore\Admin\Form\Field::fill()

    public function fill($data)
    {

        if (is_array($this->column)) {
            foreach ($this->column as $key => $column) {
                $this->value[$key] = array_get($data, $column);
            }

            return;
        }

        $this->value = array_get($data, $this->column);
    }

其中的 $this->column 即是在使用 Form 在定义表单字段的时候的$column 参数.

也就是如果你使用的是驼峰, 那么在 Field::fill() 这里是无法正确填充到值的.

偷懒一点可以把方法名直接改成下划线那种风格的, 或是在 Encore\Admin\Form::setFieldValue() 修改:

    protected function setFieldValue($id)
    {
        $relations = $this->getRelations();

        $this->model = $this->model->with($relations)->findOrFail($id);

        $data = $this->model->toArray();

        /**
         * 新增代码
         */
        if ($this->model::$snakeAttributes) {
            foreach ($this->model->getRelations() as $key => $relation) {
                $data[$key] = $data[$snake = Str::snake($key)];
                unset($data[$snake]);
            }
        }

        $this->builder->fields()->each(function (Field $field) use ($data) {
            $field->fill($data);
        });
    }

@z-song

@RunnerLee 这个让我想起我在 dingo-api 中也遇到类似的问题,我在 这里 也是做过类似这样的处理,你的这个加了判断会更好一些,💯。👍

这个问题在于laravel-admin的底层赋值到field用的是model的toArray(),而这个方法默认将所有驼峰转为连接符。

其实Laravel-admin理应直接运用eloquent的数据,而不是另外赋值到新变量。

@edwinhuish 对的,这里希望作者处理一下我就不需要另外去单独处理了。另外 snakcase 用下划来线表述的更加没有歧义。

  • 下划线 (underline)
  • 连字符 (hyphen)

这种涉及到底层的修改很麻烦的,牵一发动全局,之前好几个比这个简单的修改 @z-song 都不愿意改。

按照 @z-song 目前的观念,只想在不影响使用的情况下,小修小补。

关于你说的snakcase,这个不是 @z-song 决定的,他直接用了eloquent 的 toArray(), 是 laravel 自身的转换。

这样的话在难道大家一直是在模型内定义 snake_case 的函数来使用的,这样的话根本在如果项目有 PSR 检测的 CI 或者 git 钩子的话,代码都提交合并不了。

laravel-admin 前期无论是二次开发还是底层开发都比较容易,后面越来越麻烦,且优势不大。

首先是局限性太大了,定制成本高。

其次由于之前的规划,现在改一下功能都需要修改到底层。

另外,这种形式的框架做项目后面的优势不明显,牺牲了很多前端的可定制性。

总得来说,小小项目用一下还可以,稍微需要定制的,最好还是自己写。

能够在fill前做个钩子,有时候提取出来的数据,需要处理下再显示在模板上的。

我今天也遇到这个问题,我在$data = $this->model->toArray();,这个data是拿到了我需要的值的。有大神知道怎么解决吗

我在$data = $this->model->toArray() 上面把static::doNotSnakeAttributes($this->model);的注释去掉,问题得到了解决,但是我依赖库跟新也会覆盖掉修改。

relationName, 纯小写可以解决问题,不需要再做任何修改

受教了....

Was this page helpful?
0 / 5 - 0 ratings

Related issues

abufalbo picture abufalbo  ·  3Comments

qcol picture qcol  ·  3Comments

piian picture piian  ·  3Comments

joernroeder picture joernroeder  ·  3Comments

greentornado picture greentornado  ·  3Comments