如何使用 Laravel 存储多个复选框
How to store several checkbox using Laravel
我正在尝试将我在视图中选中的复选框保存到我的数据库中。我有一个 title
、一个 type_article
(下拉菜单)、theme
(复选框)和 contents
。
我在 article_list.blade.view
中这样做:
@foreach ($themes as $theme)
<div class="form-check form-check-inline">
<input class="form-check-input" type="checkbox" name="themeCheckbox[]" value="{{ $theme->theme_id }}">
<label class="form-check-label">{{ $theme->nom_theme }}</label>
</div>
@endforeach
我的AdminController
:
public function createArticle(Request $request)
{
$data = $request->validate([ // $data = $this->validate($request
'titreArticle' => 'bail|required|between:5,40',
'typeArticle' => 'bail|required',
'themeCheckbox' => 'required|array|min:1',
'themeCheckbox.*' => 'required|string|distinct|exists:theme,nom_theme',
'contenuArticle' => 'bail|required',
]);
$type_articles = Type_article::findOrFail($data['typeArticle']);
$article = new Article();
$article->type_article()->associate($type_articles);
$themes = Theme::whereIn('nom_theme', $data['themeCheckbox'])->get();
$article->theme()->associate($themes);
$article->titre = $data['titreArticle'];
$article->contenu = $data['contenuArticle'];
$article->date_creation = date('Y-m-d');
$article->save();
$article->theme()->attach($themes);
return view('admin/panel_admin/panel_admin');
}
一切都很好,除了复选框问题。我确实在我的视图中显示了我的错误,这就是我提交 3 个复选框时出现的内容:
The selected themeCheckbox.0 is invalid.
The selected themeCheckbox.1 is invalid.
The selected themeCheckbox.2 is invalid.
我确实有一个支点 table(文章和主题 table 和 Article_theme 支点 table)。
编辑:
问题是 $themes = Theme::whereIn('nom_theme', $data['themeCheckbox'])->get();
,我需要将 nom_theme
更改为 id_theme
。
您应该将 $theme->theme_id
传递给复选框的名称数组。然后,检查 id 是否存在于数组中,因为复选框的默认行为是删除未选中的项目。
<input class="form-check-input" type="checkbox" name="themeCheckbox[{{$theme->theme_id}}]" value="1">
我把checkbox的值设置为1,意思是当你勾选的时候,$theme->theme_id
的键值会被赋值为1。此复选框的示例输出如下所示:
themeCheckbox=[
'1' => '1';
'2' => '1';
'3' => '1';
'4' => '1';
'5' => '1';
];
因此,您必须在代码中查找键,而不是值,因为它们是唯一的 (1)。如下修改控制器并在其中使用 array_keys()
方法:
$themes = Theme::whereIn('nom_theme', array_keys($data['themeCheckbox']))->get();
更新
删除不必要的验证 'themeCheckbox' => 'required|array|min:1',
并修复另一个,如下所示:
'themeCheckbox.*' => 'required',
我正在尝试将我在视图中选中的复选框保存到我的数据库中。我有一个 title
、一个 type_article
(下拉菜单)、theme
(复选框)和 contents
。
我在 article_list.blade.view
中这样做:
@foreach ($themes as $theme)
<div class="form-check form-check-inline">
<input class="form-check-input" type="checkbox" name="themeCheckbox[]" value="{{ $theme->theme_id }}">
<label class="form-check-label">{{ $theme->nom_theme }}</label>
</div>
@endforeach
我的AdminController
:
public function createArticle(Request $request)
{
$data = $request->validate([ // $data = $this->validate($request
'titreArticle' => 'bail|required|between:5,40',
'typeArticle' => 'bail|required',
'themeCheckbox' => 'required|array|min:1',
'themeCheckbox.*' => 'required|string|distinct|exists:theme,nom_theme',
'contenuArticle' => 'bail|required',
]);
$type_articles = Type_article::findOrFail($data['typeArticle']);
$article = new Article();
$article->type_article()->associate($type_articles);
$themes = Theme::whereIn('nom_theme', $data['themeCheckbox'])->get();
$article->theme()->associate($themes);
$article->titre = $data['titreArticle'];
$article->contenu = $data['contenuArticle'];
$article->date_creation = date('Y-m-d');
$article->save();
$article->theme()->attach($themes);
return view('admin/panel_admin/panel_admin');
}
一切都很好,除了复选框问题。我确实在我的视图中显示了我的错误,这就是我提交 3 个复选框时出现的内容:
The selected themeCheckbox.0 is invalid.
The selected themeCheckbox.1 is invalid.
The selected themeCheckbox.2 is invalid.
我确实有一个支点 table(文章和主题 table 和 Article_theme 支点 table)。
编辑:
问题是 $themes = Theme::whereIn('nom_theme', $data['themeCheckbox'])->get();
,我需要将 nom_theme
更改为 id_theme
。
您应该将 $theme->theme_id
传递给复选框的名称数组。然后,检查 id 是否存在于数组中,因为复选框的默认行为是删除未选中的项目。
<input class="form-check-input" type="checkbox" name="themeCheckbox[{{$theme->theme_id}}]" value="1">
我把checkbox的值设置为1,意思是当你勾选的时候,$theme->theme_id
的键值会被赋值为1。此复选框的示例输出如下所示:
themeCheckbox=[
'1' => '1';
'2' => '1';
'3' => '1';
'4' => '1';
'5' => '1';
];
因此,您必须在代码中查找键,而不是值,因为它们是唯一的 (1)。如下修改控制器并在其中使用 array_keys()
方法:
$themes = Theme::whereIn('nom_theme', array_keys($data['themeCheckbox']))->get();
更新
删除不必要的验证 'themeCheckbox' => 'required|array|min:1',
并修复另一个,如下所示:
'themeCheckbox.*' => 'required',