Как настроить связь между таблицей 2, которая имеет отношение как один ко многим, так и множество ко многим? - PullRequest
0 голосов
/ 29 октября 2018

У меня есть таблица 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 голосов
/ 29 октября 2018

Быстрый ответ

Конечно, у вас не может быть двух функций с одинаковым именем. В вашем случае попробуйте использовать более конкретные имена для каждой функции:

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

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

Рекомендация

Вы можете использовать одно отношение many-to-many для управления обоими отношениями с помощью Сводная информация :

users таблица

  • id
  • username
  • ...

events стол

  • id
  • name
  • ...

event_user стол

  • user_id

  • event_id

  • is_creator (по умолчанию FALSE, целое число без знака)

  • ...

Затем при создании события свяжите объекты user и event и установите для поля is_creator значение TRUE.

Так в вашей User модели:

приложение / User.php

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

Затем в вашем контроллере, когда вы хотите создать событие:

приложение / Http / Контроллеры / 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.
}

А когда пользователь хочет присоединиться к событию:

приложение / Http / Контроллеры / 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.
}
0 голосов
/ 29 октября 2018

Кажется, что отношения между User и Event очень много-много, поэтому будет иметься сводное имя, например user_event

модель пользователя

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

Ссылка: https://laravel.com/docs/5.7/eloquent-relationships#many-to-many

...