laravel - 以一种形式从 laravel nova 中的关系中添加字段文本
问题描述
我是 Laravel Nova 的新手。我正在尝试构建一个用户表单。在这一刻我有这些模型: 用户,UserDetail
在用户中,我有:电子邮件、密码、用户名。在 UserDetail 我有:姓名、姓氏、性别、号码等。
现在我将为用户创建一个表单。为什么我专注于ONE?因为在我的用户资源字段中,我有:
HasOne::make("UserDetail", "details"),
但是对于设置用户详细信息,我有两种形式:一种用于用户数据(用户名、密码、电子邮件),保存用户后我可以设置详细信息。
所以我不想为 1 个资源编译 2 种不同的形式。
我找到了这个包,但似乎坏了:
https://github.com/yassipad/laravel-nova-nested-form/issues/66
并且未显示 UserDetails 字段。
那么有没有其他方法可以从关系中添加文本字段并合并到同一个表单中?
解决方案
你可以通过使用Laravel 的 accessors 和 mutators来解决这个问题。
在这个例子中,我只会添加gender
from,UserDetail
因为我很懒。所以我们首先在我们的User
模型中添加一个性别访问器
public function details()
{
return $this->hasOne(UserDetail::class);
}
public function getGenderAttribute()
{
return $this->details->gender ?? null;
}
此 getter 将从详细信息中获取性别,如果不存在详细信息,则为 null。
现在我们User
在 Nova 中的资源中添加一个新字段。
public function fields(Request $request)
{
return [
ID::make()->sortable(),
Gravatar::make(),
Text::make('Name')
->sortable()
->rules('required', 'max:255'),
Text::make('Email'),
Password::make('Password'),
Text::make('Gender')
->rules('required'),
];
}
转到创建用户表单,它看起来像这样:
当然这不会让它保存它,因为它不知道如何处理该gender
字段。为了处理这个我们重写fillFields
方法。
protected static function fillFields(NovaRequest $request, $model, $fields)
{
// Get all of our user details data
$userDetails = $request->only(['gender']);
// Remove them from the request
$request->request->remove('gender');
$result = parent::fillFields($request, $model, $fields);
// Insert them in the details object after model has been saved.
$result[1][] = function () use ($userDetails, $model){
$model->details()->updateOrCreate(
[],
$userDetails
);
};
return $result;
}
现在我们可以将性别字段视为用户的正常字段,并且不需要UserDetail
资源。要添加更多字段以保存在用户详细信息表中,我们必须将它们添加到我们的唯一并从我们的请求中删除它们。(将它放在一个数组中是有意义的)
此方法在更新用户时也适用,因为我们选择使用updateOrCreate
.
关于这种方法的一个额外说明是我们刚刚引入了一个 n+1 查询,因为我们details
在尝试获取gender
属性时会延迟加载关系。为了解决这个问题,我们只需覆盖indexQuery
并添加details
到查询构建器。
public static function indexQuery(NovaRequest $request, $query)
{
$query->with('details');
return parent::indexQuery($request, $query);
}
推荐阅读
- javascript - 用户登录后如何通过浏览器记住登录详细信息
- laravel - Laravel:搜索查询
- facebook-graph-api - Facebook Workplace Graph API - 如何使用群组名称获取群组 ID
- node.js - Jenkins 管道 - 如何从一个节点启动 node.js 应用程序并在不同节点中使用它?
- scala - 组合柯里化函数
- sql-server - 在 SSMS 中,登录名右侧显示的数字是多少?
- android - 错误:(246, 5) 错误:资源 'attr/font' 与配置 '' 的重复值
- vba - 行源行为在不重新加载用户表单的情况下不更新/重置列表框 // 使用 list = 范围获取列标题
- oracle - 未启用 Oracle 约束
- r - 矩阵中特定行的行和