【问题标题】:Multi-select dropdown with Many to many relation具有多对多关系的多选下拉菜单
【发布时间】:2020-10-06 04:23:12
【问题描述】:

在我的 laravel 项目中,我创建了三个表,分别为 employeesteamsemployee_teams。 “employee_teams”表中存在多对多关系,外键为employee_idteam_id

“employee_teams”表数据库结构

标识 |员工编号 | team_id

在员工表单中有一个多选下拉菜单,可帮助为特定员工分配多个团队。

<select name="namedropdown[]" id="namedropdown" class="selectpicker" multiple data-live-search="true">
    <option value="" disabled selected>Nothing selected</option>
         @foreach ($tdropdown as $key => $tdrop)
         <option value="{{$key}}">{{$tdrop}}</option>
         @endforeach
</select>

我想要将“team_id”和“employee_id”保存到“employee_teams”表中

这是员工模型

class employee extends Model
{  
    public function teams()
    {
         return $this->belongsToMany(team::class, 'employee_teams');
    }
}

这是团队模型

class team extends Model
{
    public function employees()
    {
         return $this->belongsToMany(employee::class, 'employee_teams');
    }
}

这里是employee_team表迁移

class CreateEmployeeTeamsTable extends Migration
{
    public function up()
    {
        Schema::create('employee_teams', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('employee_id')->unsigned();
            $table->integer('team_id')->unsigned();
            $table->foreign('employee_id')->references('id')->on('employees')->onDelete('cascade');
            $table->foreign('team_id')->references('id')->on('teams')->onDelete('cascade');
            $table->timestamps();
        });
    }

这是员工控制器中的存储功能

use App\employee;
use App\team;
use App\employee_team;

// codes

 $employee = new employee();

       $employee->namedropdown = implode(',', $request->input('namedropdown')); //Already save multi-select dropdown ids to the database 

       $employee->save();

 $employee_team = new employee_team();

      $employee->teams()->attach($employee->namedropdown);

      return redirect()->route('employee.index')->with('success','Data Added');
}

错误来自SQLSTATE[01000]: Warning: 1265 Data truncated for column 'team_id' at row 1

请帮我将employee_id 和team_id 保存到“employee_teams”表中。非常感谢。

【问题讨论】:

  • 你的模型看起来不错。你能分享你的迁移吗?我认为有一个数据库问题。 (您不需要$employee_team = new employee_team() 行)
  • 好的,我添加了“employee_team_table”迁移。好的,我将其删除。帮我将employee_id 和team_id 保存到“employee_teams”表中。
  • 您可以查看我上面的答案并重建您的代码。

标签: laravel relationship multi-select


【解决方案1】:

一个工作样本(经过测试):

迁移:2020_06_16_000000_create_employees_table.php

class CreateEmployeesTable extends Migration
{

    public function up()
    {
        Schema::create('employees', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::dropIfExists('employees');
    }
}

迁移:2020_06_16_000000_create_teams_table.php

class CreateTeamsTable extends Migration
{
    public function up()
    {
        Schema::create('teams', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::dropIfExists('teams');
    }
}

迁移:2020_06_16_000000_create_employee_team_table.php

class CreateEmployeeTeamTable extends Migration
{
    public function up()
    {
        Schema::create('employee_team', function (Blueprint $table) {
            $table->id();
            $table->unsignedBigInteger('employee_id')->nullable();
            $table->foreign('employee_id')->references('id')->on('employees')->onDelete('cascade');
            $table->unsignedBigInteger('team_id')->nullable();
            $table->foreign('team_id')->references('id')->on('teams')->onDelete('cascade');
            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::dropIfExists('employee_team');
    }
}

型号:Employee.php

class Employee extends Model
{    
    public function teams()
    {
        return $this->belongsToMany('App\Team');
    }
}

型号:Team.php

class Team extends Model
{    
    public function employees()
    {
        return $this->belongsToMany('App\Employee');
    }
}

路由:routes/web.php:

Route::get('/select_team/{id?}', 'EmployeeController@select_team')->name('employee.select_team');
Route::post('/save_teams/{id?}', 'EmployeeController@save_teams')->name('employee.save_teams');

控制器:EmployeeController.php

use Illuminate\Http\Request;
use App\Team;
use App\Employee;

class EmployeeController extends Controller
{
    public function select_team($employee_id){    
        return view('select_team', ['tdropdown'=>Team::all(), 'employee'=>Employee::find($employee_id)]);
    }

    public function save_teams(Request $request, $employee_id){   
        $employee = Employee::find($employee_id);
        foreach ($request->namedropdown as $team_id){
            $employee->teams()->attach($team_id);
        }

        return redirect()->route('employee.index')->with('success','Data Added');
    }
}

刀片:select_team.blade.php

<!DOCTYPE html>
<form action="/save_teams/{{$employee->id}}" method="post">
        @csrf
    <select name="namedropdown[]" id="namedropdown" class="selectpicker" multiple data-live-search="true">
    <option value="" disabled selected>Nothing selected</option>
            @foreach ($tdropdown as $tdrop)
            <option value="{{$tdrop->id}}">{{$tdrop->name}}</option>
            @endforeach
    </select>
    <button>Submit</button>
</form>
</html>

我认为这是一个很好的例子,可以给你一个想法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-10
    • 2011-06-12
    • 2021-09-29
    • 2019-07-04
    • 1970-01-01
    相关资源
    最近更新 更多