Php 在数据透视表上进行一对多插入

Php 在数据透视表上进行一对多插入,php,laravel,eloquent,one-to-many,laravel-5.3,Php,Laravel,Eloquent,One To Many,Laravel 5.3,我使用的是Laravel 5.3ad,在通过hasMany关系进行保存时遇到问题 我有员工和活动表,它们有一对多的关系,即每个员工将执行许多活动 当我使用associate()添加针对员工的活动时,它会向我发送一个错误: BadMethodCallException in Builder.php line 2440: Call to undefined method Illuminate\Database\Query\Builder::associate() 以下是数据库结构和代码: 数据库结

我使用的是Laravel 5.3ad,在通过
hasMany
关系进行保存时遇到问题

我有员工和活动表,它们有一对多的关系,即每个员工将执行许多活动

当我使用
associate()
添加针对员工的活动时,它会向我发送一个错误:

BadMethodCallException in Builder.php line 2440:
Call to undefined method Illuminate\Database\Query\Builder::associate()
以下是数据库结构和代码:

数据库结构:

employee (1st table)
– employee_id
– employee_name
- created_at
- updated_at

activity (2nd table)
– activity_id
– activity_name
- created_at
- updated_at

employee_activity (pivot table)
– employee_activity_employee_id
– employee_activity_activity_id
class Employee extends Model
{
    protected $table = 'employee';
    protected $primaryKey = 'employee_id';

    public function activity() {
        return $this->hasMany('App\Models\Activity', 'employee_activity', 'employee_activity_employee_id', 'employee_id');
    }
}
class Activity extends Model
{
    protected $table = 'activity';
    protected $primaryKey = 'activity_id';

    public function employee() {
        return $this->belongsTo('App\Models\Employee', 'employee_activity', 'employee_activity_activity_id' ,'activity_id');
    }
}
public function EmployeeActivityAssociation()
{
    $employee_id = Input::get('employee_id');
    $activity_ids = Input::get('activity_id'); // This is an array of activities
    $employee = Employee::find($employee_id);
    if (!empty($employee)) {
         //Adding activity under the employee
        foreach ($activity_ids as $id) {
            $activity = Activity::find($id);
            $employee->activity()->associate($activity);
            $employee->save();
        }
        return 'Activities asscoiated to employee';
    }   
    else {
        return 'Employee not found';
    }
}
模型类员工:

employee (1st table)
– employee_id
– employee_name
- created_at
- updated_at

activity (2nd table)
– activity_id
– activity_name
- created_at
- updated_at

employee_activity (pivot table)
– employee_activity_employee_id
– employee_activity_activity_id
class Employee extends Model
{
    protected $table = 'employee';
    protected $primaryKey = 'employee_id';

    public function activity() {
        return $this->hasMany('App\Models\Activity', 'employee_activity', 'employee_activity_employee_id', 'employee_id');
    }
}
class Activity extends Model
{
    protected $table = 'activity';
    protected $primaryKey = 'activity_id';

    public function employee() {
        return $this->belongsTo('App\Models\Employee', 'employee_activity', 'employee_activity_activity_id' ,'activity_id');
    }
}
public function EmployeeActivityAssociation()
{
    $employee_id = Input::get('employee_id');
    $activity_ids = Input::get('activity_id'); // This is an array of activities
    $employee = Employee::find($employee_id);
    if (!empty($employee)) {
         //Adding activity under the employee
        foreach ($activity_ids as $id) {
            $activity = Activity::find($id);
            $employee->activity()->associate($activity);
            $employee->save();
        }
        return 'Activities asscoiated to employee';
    }   
    else {
        return 'Employee not found';
    }
}
模型课活动:

employee (1st table)
– employee_id
– employee_name
- created_at
- updated_at

activity (2nd table)
– activity_id
– activity_name
- created_at
- updated_at

employee_activity (pivot table)
– employee_activity_employee_id
– employee_activity_activity_id
class Employee extends Model
{
    protected $table = 'employee';
    protected $primaryKey = 'employee_id';

    public function activity() {
        return $this->hasMany('App\Models\Activity', 'employee_activity', 'employee_activity_employee_id', 'employee_id');
    }
}
class Activity extends Model
{
    protected $table = 'activity';
    protected $primaryKey = 'activity_id';

    public function employee() {
        return $this->belongsTo('App\Models\Employee', 'employee_activity', 'employee_activity_activity_id' ,'activity_id');
    }
}
public function EmployeeActivityAssociation()
{
    $employee_id = Input::get('employee_id');
    $activity_ids = Input::get('activity_id'); // This is an array of activities
    $employee = Employee::find($employee_id);
    if (!empty($employee)) {
         //Adding activity under the employee
        foreach ($activity_ids as $id) {
            $activity = Activity::find($id);
            $employee->activity()->associate($activity);
            $employee->save();
        }
        return 'Activities asscoiated to employee';
    }   
    else {
        return 'Employee not found';
    }
}
控制器:

employee (1st table)
– employee_id
– employee_name
- created_at
- updated_at

activity (2nd table)
– activity_id
– activity_name
- created_at
- updated_at

employee_activity (pivot table)
– employee_activity_employee_id
– employee_activity_activity_id
class Employee extends Model
{
    protected $table = 'employee';
    protected $primaryKey = 'employee_id';

    public function activity() {
        return $this->hasMany('App\Models\Activity', 'employee_activity', 'employee_activity_employee_id', 'employee_id');
    }
}
class Activity extends Model
{
    protected $table = 'activity';
    protected $primaryKey = 'activity_id';

    public function employee() {
        return $this->belongsTo('App\Models\Employee', 'employee_activity', 'employee_activity_activity_id' ,'activity_id');
    }
}
public function EmployeeActivityAssociation()
{
    $employee_id = Input::get('employee_id');
    $activity_ids = Input::get('activity_id'); // This is an array of activities
    $employee = Employee::find($employee_id);
    if (!empty($employee)) {
         //Adding activity under the employee
        foreach ($activity_ids as $id) {
            $activity = Activity::find($id);
            $employee->activity()->associate($activity);
            $employee->save();
        }
        return 'Activities asscoiated to employee';
    }   
    else {
        return 'Employee not found';
    }
}

我的关系定义不正确吗?

您的关系定义不正确。通过查看您的表结构,它应该是关系

模范班员工:

public function activity() {
    return $this->belongsToMany('App\Models\Activity', 'employee_activity', 'employee_activity_employee_id', 'employee_id');
}
示范班活动:

public function employee() {
    return $this->belongsToMany('App\Models\Employee', 'employee_activity', 'employee_activity_activity_id' ,'activity_id');
}
因此,您的控制器应为:

public function EmployeeActivityAssociation()
{
    $employee_id = Input::get('employee_id');
    $activity_ids = Input::get('activity_id'); // This is an array of activities
    $employee = Employee::find($employee_id);
    if (!empty($employee)) {
        $employee->activity()->attach($activity_ids);
      return 'Activities asscoiated to employee';
    }   
    else {
        return 'Employee not found';
    }
}
如果要坚持一对多关系,则必须将表架构更改为:


删除表
employee\u activity
表,并在活动表中添加列
employee\u id
,然后根据定义关系。

您的关系定义不正确。通过查看您的表结构,它应该是关系

模范班员工:

public function activity() {
    return $this->belongsToMany('App\Models\Activity', 'employee_activity', 'employee_activity_employee_id', 'employee_id');
}
示范班活动:

public function employee() {
    return $this->belongsToMany('App\Models\Employee', 'employee_activity', 'employee_activity_activity_id' ,'activity_id');
}
因此,您的控制器应为:

public function EmployeeActivityAssociation()
{
    $employee_id = Input::get('employee_id');
    $activity_ids = Input::get('activity_id'); // This is an array of activities
    $employee = Employee::find($employee_id);
    if (!empty($employee)) {
        $employee->activity()->attach($activity_ids);
      return 'Activities asscoiated to employee';
    }   
    else {
        return 'Employee not found';
    }
}
如果要坚持一对多关系,则必须将表架构更改为:


删除表
employee\u activity
表,并在活动表中添加列
employee\u id
,然后根据定义关系。

使用多对多方案,在迁移时,在表“employee\u activity”上将字段“activity\u id”定义为“unique”:

$table->unsignedInteger('employe_id');    
$table->unsignedInteger('activity_id')->unique();

这样,您可以在“employee_activity”表中只注册一个与一个员工关联的活动,而一个员工可以与多个活动关联。否则,将生成唯一错误。

使用多对多方案,在迁移时,在表“employee\u activity”中将字段“activity\u id”定义为“unique”:

$table->unsignedInteger('employe_id');    
$table->unsignedInteger('activity_id')->unique();

这样,您可以在“employee_activity”表中只注册一个与一个员工关联的活动,而一个员工可以与多个活动关联。否则,将生成唯一的错误。

这会对您有所帮助。它是多对多的。这可以帮助你,这是多对多的。