【问题标题】:Laravel Insert Data to Pivot Table From blade.phpLaravel 从blade.php 将数据插入数据透视表
【发布时间】:2020-08-22 13:03:31
【问题描述】:

我想知道我应该对此表单进行哪些修改,以便能够将新添加的问题链接到一个组,例如我现在添加的问题是你叫什么名字?我希望它链接到第一组,这样只有第一组的用户才能看到它

这是我的问题模型:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Question extends Model
{
    public function answer()
    {
        return $this->hasMany('App\Answer')->latest();
    }

    public function userAnswer(){
      return $this->hasOne('App\Answer')->where('user_id', Auth()->id())->latest()->first();
    }
    public function group()
    {
        return $this->belongsToMany(Group::class);
    }

}

这是我的组模型:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Group extends Model
{
  public function question()
  {
      return $this->hasMany('App\Question');
  }
}

这是我的 Group_Question 表(包含 question_id 和 group_id 的数据透视表)

 Schema::create('group_question', function (Blueprint $table) {
        $table->id();
        $table->unsignedBigInteger('group_id');
        $table->foreign('group_id')->references('id')->on('groups')->onDelete('cascade');
        $table->unsignedBigInteger('question_id');
        $table->foreign('question_id')->references('id')->on('questions')->onDelete('cascade');
        $table->timestamps();
      });

最后,这是我用来将问题添加到问题表的表单:

<form class="" action="/questions/create" method="post">
          @csrf

          <div  class="form-group">
            <input type="text" name="question" value="" class="form-control" placeholder="Please Enter Question">
          </div>

          @can('add', \App\Question::class)
          <div class="form-group">
            <button type="submit" name="add" class="btn btn-success float-right">Add Question</button>
          </div>
          @endcan

        </form>

如果您可以编辑我的来源以便能够将问题分配给数据透视表中的组,我将不胜感激。

【问题讨论】:

  • 我认为您需要在添加问题表单中的组列表下拉列表
  • 我怎样才能使 th3 @can(添加 2 个模型?问题和组)

标签: laravel eloquent pivot-table


【解决方案1】:

您需要添加多选才能将组分配给问题。由于 $question->group 是一个 belongsToMany 关系,您可以明显地将一个问题分配给多个组。你可以这样做:

<select name="groups[]" multiple="multiple">
    @foreach ($groups as $group)
        <option value="{{ $group->getKey() }}">{{ $group->name }}</option>
    @endforeach
</select>

警告:

  1. $groups 应该由 QuestionController 的 create 操作导出,类似于 $groups = Group::get()。或者,您可以在刀片模板中写 @foreach (Group::get() as $group),但尽可能多地保留模板中的逻辑是养成的好习惯。
  2. $group-&gt;name 只是猜测,不知道你的分组表是什么样子的
  3. 示例 HTML 只是让您入门的最低要求,您应该确保在验证错误等时预先填充旧值。我把它留给你作为练习。

接下来,转到您的 QuestionController 并将问题链接到适当的组,方法是将以下行添加到您的 store 方法中:

$question->group()->attach($request->input('groups', [])));

补充说明:

  1. 为了遵循 Laravel 的最佳实践,问题模型中的组关系应该是 studly case 和复数,因为它是 BelongsToMany 关系。因此,您应该将其重命名为 Groups()

  2. answer() 方法也应该调用Answers()

  3. userAnswer() getter 中定义一个新的HasOne 关系有点奇怪。为什么不为当前用户的 Answer 实例实现 getter 或自定义属性,而是通过执行类似的操作

    public function getUserAnswerAttribute(): ?App\Answer
    {
        return $this->Answer()->whereUserId(Auth()->id())->first();
    }
    
    

(如果你对属性不熟悉,可以直接调用$question-&gt;userAnswer获取结果)。

  1. 每个用户真的只能对每个问题发布一个答案吗?
  2. 您可能希望使用&lt;form action="{{ route('question.create') }}" method="POST"&gt; 而不是硬编码 URL。这就是命名路线的用途。

【讨论】:

    猜你喜欢
    • 2014-08-24
    • 1970-01-01
    • 2020-09-19
    • 1970-01-01
    • 2018-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-21
    相关资源
    最近更新 更多