Laravel 在一个 Pivot 上进行一对多插入 table
Laravel One-To-Many insertion on a Pivot table
我正在使用 Laravel 5.3 广告,在通过 hasMany
关系进行保存时遇到问题。
我有表 employee 和 activity 具有一对多关系,即每个员工将执行许多活动。
当我使用 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员工:
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');
}
}
型号ClassActivity:
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';
}
}
我这里的关系定义有误吗?
您的关系定义不正确。通过查看您的 table 结构,它应该是 many-to-many
关系。
模特Class员工:
public function activity() {
return $this->belongsToMany('App\Models\Activity', 'employee_activity', 'employee_activity_employee_id', 'employee_id');
}
型号ClassActivity:
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';
}
}
如果您想坚持一对多关系,那么您必须将 table 架构更改为:
删除table employee_activity
table并在activity中添加列employee_id
table然后根据one-to-many定义关系.
使用多对多方案,在迁移时,将字段 'activity_id' 定义为 'unique' on table 'employee_activity':
$table->unsignedInteger('employe_id');
$table->unsignedInteger('activity_id')->unique();
这样,您可以在'employee_activity' table 上注册一个activity 只关联一个员工,一个员工可以关联多个活动。否则,将产生一个独特的错误。
我正在使用 Laravel 5.3 广告,在通过 hasMany
关系进行保存时遇到问题。
我有表 employee 和 activity 具有一对多关系,即每个员工将执行许多活动。
当我使用 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员工:
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');
}
}
型号ClassActivity:
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';
}
}
我这里的关系定义有误吗?
您的关系定义不正确。通过查看您的 table 结构,它应该是 many-to-many
关系。
模特Class员工:
public function activity() {
return $this->belongsToMany('App\Models\Activity', 'employee_activity', 'employee_activity_employee_id', 'employee_id');
}
型号ClassActivity:
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';
}
}
如果您想坚持一对多关系,那么您必须将 table 架构更改为:
删除table employee_activity
table并在activity中添加列employee_id
table然后根据one-to-many定义关系.
使用多对多方案,在迁移时,将字段 'activity_id' 定义为 'unique' on table 'employee_activity':
$table->unsignedInteger('employe_id');
$table->unsignedInteger('activity_id')->unique();
这样,您可以在'employee_activity' table 上注册一个activity 只关联一个员工,一个员工可以关联多个活动。否则,将产生一个独特的错误。