返回
如何使用 FilamentPHP Repeater 组件保存动态表格数据,保持日期一致性
php
2024-03-01 23:04:01
FilamentPHP Repeater 组件指南:保存动态表格数据
简介
FilamentPHP 是一种基于 Laravel 的 PHP 框架,用于快速构建管理界面。它的 Repeater 组件非常适合创建动态表格,允许用户添加和删除任意数量的行。本文将深入探讨如何使用 Repeater 组件,以及如何将数据保存在数据库中,同时保持日期的一致性,而成员和类型标签却可以独立变化。
创建表单
构建表单是第一步,我们使用 DatePicker 组件获取开始日期,而 Repeater 组件则用于创建动态表格,用户可以在其中添加多个成员和类型标签。
public static function form(Form $form): Form
{
return $form
->schema([
Forms\Components\DatePicker::make('start_date')->rules(['required'])->label('Week Start Date')->required(),
Repeater::make('items')
->schema([
Forms\Components\Select::make('member_id')->relationship('member', 'name')->searchable()->preload()->rules(['required'])->label('Member Name')->required(),
Forms\Components\Select::make('type')->options([
'Productive' => 'Productive',
'Effective' => 'Effective',
"CEO's Favorite" => "CEO's Favorite",
])->searchable()->label('Winning Type')->required(),
]),
]);
}
数据库保存策略
在保存表单数据时,我们的目标是将数据保存在数据库中,其中开始日期相同,而每个成员和类型标签却不同。为此,我们将使用一对多关系。
1. 创建 weekly_winners 表:
Schema::create('weekly_winners', function (Blueprint $table) {
$table->id();
$table->unsignedBigInteger('member_id');
$table->foreign('member_id')->references('id')->on('members');
$table->date('start_date')->nullable();
$table->string('type')->nullable();
$table->timestamps();
});
2. 创建 Member 模型:
class Member extends Model
{
public function weeklyWinners()
{
return $this->hasMany(WeeklyWinner::class);
}
}
3. 创建 WeeklyWinner 模型:
class WeeklyWinner extends Model
{
public function member()
{
return $this->belongsTo(Member::class);
}
}
处理表单提交
当表单提交时,我们将执行以下步骤:
- 获取表单数据。
- 遍历 Repeater 中的行。
- 对于每一行,创建一个新的 WeeklyWinner 模型实例。
- 设置 start_date 字段为表单中提供的开始日期。
- 设置 member_id 字段为该行的 member_id 值。
- 设置 type 字段为该行的 type 值。
- 保存 WeeklyWinner 模型实例。
public function store(Request $request)
{
$data = $request->validate([
'start_date' => 'required|date',
'items' => 'required|array',
'items.*.member_id' => 'required|exists:members,id',
'items.*.type' => 'required|string',
]);
foreach ($data['items'] as $item) {
WeeklyWinner::create([
'start_date' => $data['start_date'],
'member_id' => $item['member_id'],
'type' => $item['type'],
]);
}
}
结论
使用 Repeater 组件和一对多关系,你可以轻松创建动态表单,并以所需的方式将数据保存在数据库中。这种方法不仅灵活,而且可扩展,可以显著节省时间并提高开发效率。
常见问题解答
1. 如何限制 Repeater 行的数量?
可以使用 minItems
和 maxItems
选项来限制行数。
2. 如何在保存前自定义数据?
在 beforeSave
回调中可以修改数据。
3. 如何处理多对多关系?
对于多对多关系,可以使用 BelongsToMany
关系。
4. 如何实现拖放排序?
可以使用 ReorderItems
组件。
5. 如何在动态表单中使用验证?
可以使用 requiredRule
和 minLengthRule
等验证规则。