我有活动和参与者。代表个人资料的参与者可以参加活动。我有一个名为event_participants
的数据透视表。
个人资料中的关系为
public function events()
{
return $this->belongsToMany('App\Event', 'event_participants', 'event_id', 'profile_id')->withTimestamps();
}
事件中的关系是
public function participants()
{
return $this->belongsToMany('App\Profile', 'event_participants', 'event_id', 'profile_id')->withTimestamps();
}
我通过获取事件,然后附加个人资料,将参与者与他们所关注的事件相关联
$event->participants()->attach($profile['id']);
我可以这样做获得活动参与者的名单
$event->participants
但是我的问题是,当我尝试获取参与事件的个人资料的事件时,
$profile->events
我总是得到null / empty集合。有什么我想念的吗?谢谢。
更新:我对数据透视表的迁移如下
Schema::create('event_participants', function (Blueprint $table) {
$table->integer('profile_id')->unsigned()->index();
$table->foreign('profile_id')->references('id')->on('profiles')->onDelete('cascade');
$table->integer('event_id')->unsigned()->index();
$table->foreign('event_id')->references('id')->on('events')->onDelete('cascade');
$table->timestamps();
});
另外,如果我尝试将事件附加到$profile->events()->attach($eventId);
之类的个人资料上,则
我收到以下错误:
"SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`database`.`event_participants`, CONSTRAINT `event_participants_profile_id_foreign` FOREIGN KEY (`profile_id`) REFERENCES `profiles` (`id`) ON DELETE CASCADE) (SQL: insert into `event_participants` (`created_at`, `event_id`, `profile_id`, `updated_at`) values (2019-03-16 07:33:03, 1, 17, 2019-03-16 07:33:03))"
答案 0 :(得分:2)
您好,您应该像这样翻转事件模型中关系中的键:
return $this->belongsToMany('App\Event', 'event_participants', 'profile_id', 'event_id')->withTimestamps();
您在两个方向上都使用相同的关系。
第三个参数是要在其上定义关系的模型的外键名称,而第四个参数是要加入的模型的外键名称。
根据laravel文档