如何在具有一对多和多对多关系的2个表之间建立关系?

时间:2018-10-29 17:47:25

标签: laravel model eloquent many-to-many one-to-many

我有一个Users表和一个Events表。

它具有一对多的关系。

每个用户可以创建许多事件

每个事件都属于一个用户

而且,它具有多对多关系。

每个用户可以根据需要加入任意数量的事件

每个事件可以由许多用户加入。

这需要数据透视表。

现在,我被卡住了。

这是事件模型。

public function user(){
     return $this->belongsTo('App\User');
}

public function users(){
     return $this->belongsToMany('App\User')
                 ->withTimestamps();
}    

这是用户模型。

public function events(){
     return $this->hasMany('App\Event');
}

public function events(){
     return $this->belongsToMany('App\Event');
}

问题出在用户模型中,我无法定义具有相同名称的多个功能。

那么,有没有办法正确地做到这一点?

2 个答案:

答案 0 :(得分:0)

UserEvent之间似乎有很多关系,因此将有user_event之类的枢轴名称

用户模型

public function events() {
    return $this->belongsToMany('App\Event')->using('App\UserEvent'); 
}

参考:https://laravel.com/docs/5.7/eloquent-relationships#many-to-many

答案 1 :(得分:0)

快速解答

当然不能有两个具有相同名称的函数。根据您的情况,尝试为每个函数使用更具体的名称:

public function createdEvents()
{
     return $this->hasMany('App\Event');
}

public function joinedEvents()
{
     return $this->belongsToMany('App\Event');
}

建议

您可以使用单个many-to-many关系来管理与Pivot information的两个关系:

users

  • id
  • username
  • ...

events

  • id
  • name
  • ...

event_user

  • user_id

  • event_id

  • is_creator(默认FALSE,无符号整数)

  • ...

然后在创建事件时,关联userevent对象并将is_creator字段设置为TRUE

因此,在您的User模型中:

app / User.php

public function events()
{
     return $this->belongsToMany('App\Event')->withPivot('is_creator');
}

然后在您要创建事件的控制器中:

app / Http / Controllers / SomeCoolController.php

public function store(CreateEventRequest $request)
{
    // Get your event data
    $data = $request->only(['your', 'event', 'fields']);
    // create your object
    $newEvent = Event::create($data);
    // create the relationship with the additional pivot flag.
    auth()->user()->events()->attach($newEvent, ['is_creator' => true]);

    // the rest of your code.
}

当用户想“加入”事件时:

app / Http / Controllers / SomeCoolController.php

public function join(JoinEventRequest $request)
{
    // Get the event
    $event = Event::find($request->event_id);
    // relate the ev
    auth()->user()->events()->attach($newEvent, ['is_creator' => false]);
    // or just this, because its already set to false by default:
    // auth()->user()->events()->attach($newEvent);

    // the rest of your code.
}