点击编辑框按钮后提示

定义的关联方法命名用的是驼峰吧?
可以把定义关联的模型的静态属性 $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 用下划来线表述的更加没有歧义。
这种涉及到底层的修改很麻烦的,牵一发动全局,之前好几个比这个简单的修改 @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, 纯小写可以解决问题,不需要再做任何修改
受教了....
Most helpful comment
laravel-admin 前期无论是二次开发还是底层开发都比较容易,后面越来越麻烦,且优势不大。
首先是局限性太大了,定制成本高。
其次由于之前的规划,现在改一下功能都需要修改到底层。
另外,这种形式的框架做项目后面的优势不明显,牺牲了很多前端的可定制性。
总得来说,小小项目用一下还可以,稍微需要定制的,最好还是自己写。