【问题标题】:How to store several checkbox using Laravel如何使用 Laravel 存储多个复选框
【发布时间】:2021-01-15 21:16:59
【问题描述】:

我正在尝试将我在视图中选中的复选框保存到我的数据库中。我有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.

我确实有一个数据透视表(Article 和 Theme 作为表格,Article_theme 作为数据透视表)。

编辑:

问题是$themes = Theme::whereIn('nom_theme', $data['themeCheckbox'])-&gt;get();,我需要把nom_theme改成id_theme。

【问题讨论】:

    标签: laravel laravel-8


    【解决方案1】:

    您应该将$theme-&gt;theme_id 传递给复选框的名称数组。然后,检查 id 是否存在于数组中,因为 checkbox 的默认行为是删除未选中的项目。

    <input class="form-check-input" type="checkbox" name="themeCheckbox[{{$theme->theme_id}}]" value="1">
    

    我将复选框的值设置为1,这意味着当您选中它时,将为$theme-&gt;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' =&gt; 'required|array|min:1', 并修复另一个,如下所示:

    'themeCheckbox.*' => 'required',
    

    【讨论】:

    • 您好,首先感谢您的帮助。我添加了你问我的内容,我的表单下方有这个错误:The selected themeCheckbox.$theme-&gt;theme_id is invalid. 正如我所说,我有一个 pivot 表和我的 id_article 和 theme_id
    • 我忘记在name="themeCheckbox[$theme-&gt;theme_id]" 中添加{{ 和}}。我已经在答案中修改了它。
    • 当我选中第一个和第三个复选框时,我现在遇到了这个错误The themeCheckbox.1 field has a duplicate value. The themeCheckbox.3 field has a duplicate value.。
    • @Leon 注意答案中的更新并修复验证
    • Nvm,没看到更新。现在我有这个错误:Call to undefined method Illuminate\Database\Eloquent\Relations\BelongsToMany::associate() 我想我有这个错误,因为在Article 模型中,我正在这样做:return $this-&gt;belongsToMany('App\Models\Theme', 'themes_articles', 'id_article', 'theme_id'); 和我的控制器内部$article-&gt;theme()-&gt;associate($themes);。我有 belongsToMany 关系和 associate 功能。我应该用什么替换 associate() ?
    猜你喜欢
    • 1970-01-01
    • 2018-12-18
    • 1970-01-01
    • 2018-02-20
    • 1970-01-01
    • 2014-08-19
    • 2021-08-23
    • 2018-09-03
    • 1970-01-01
    相关资源
    最近更新 更多