Красноречивое отношение один к одному с одной моделью - PullRequest
0 голосов
/ 08 октября 2018

У меня есть данные для работы: у меня есть таблица, содержащая всех спортсменов, которая называется sportevents.

id ....
name ....
....

У этих спортсменов есть сводная таблица, в которой определяются отношения к тому же самому спортсмену, произошедшему в предыдущем году и в следующем году.Немного запутанный дизайн, но вот таблица, называемая событиями: я пытаюсь объяснить с 2018 и 2019 годами

id ....
event1: sportevent_id of 2019 event
event2: sportevent_id or 2018 event
....

Мой подход заключается в создании модели с именем Eventrelation со следующими отношениями:

public function previous(){
    return $this->belongsTo('App\Sportevent','event1','id' );
}

public function next(){
    return $this->belongsTo('App\Sportevent','event2','id' );
}

и в моей Sportevent модели я бы сделал следующее:

public function previousEvent(){
    return $this->hasOne('App\Eventrelation','event2','id' );
}

public function nextEvent(){
    return $this->hasOne('App\Eventrelation','event1','id');
}

Хотя это сработает, я не думаю, что это правильный способ сделать это.Я настроил другие отношения с помощью сводной таблицы, но эта, кажется, немного сложнее, учитывая существующую структуру данных и отношение к той же модели.Любой совет будет высоко ценится.

ОБНОВЛЕНИЕ

Я заставил его работать так, как я предложил выше, причина, почему я предпочел бы более чистую версию, состоит в том, чтобы уменьшитькод (это часть того, чтобы быть чище :-)).Итак, вот как я называю эти отношения и как я бы скорее назвал их:

    $previousEvent = $thisEvent->previousEvent ? $thisEvent->previousEvent->previous : null;
    $nextEvent = $thisEvent->nextEvent ? $thisEvent->nextEvent->next : null;

    // Better would be:
    $previousEvent = $thisEvent->previousEvent;
    $nextEvent = $thisEvent->nextEvent;

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

Вот полное решение (вообще не нужна сводная таблица)

Я добавил 2 поля в свою таблицу sportsevents

previous_sportevent_id  int(11) Null    
next_sportevent_id  int(11) Null

Затем я перенесданные таблицы взаимосвязей событий с новыми столбцами

UPDATE `sportevents`
INNER JOIN eventrelations ON eventrelations.event1 = sportevents.id
SET sportevents.previous_sportevent_id = eventrelations.event2

UPDATE `sportevents`
INNER JOIN eventrelations ON eventrelations.event2 = sportevents.id
SET sportevents.next_sportevent_id = eventrelations.event1

В модели Sportevent я изменил отношения:

public function previousEvent(){
    return $this->hasOne('App\Sportevent','id','previous_sportevent_id' );
}

public function nextEvent(){
    return $this->hasOne('App\Sportevent','id','next_sportevent_id');
}

Теперь я могу правильно использовать новые отношения и очистить их в своем ресурсе

return [
      'id' => $this->id,
      ......
      'nextEvent' => $this->nextEvent,
      'previousEvent' => $this->previousEvent,
    ];

Теперь можно удалить связь между событиями модели и событиями таблиц.Надеюсь, это кому-нибудь поможет ...

0 голосов
/ 08 октября 2018

вам не нужна модель Pivot вообще.вы можете установить отношения с самим классом.

в вашей модели sportsevent:

public function previousEvent()
{
  return $this->belongsToMany(SportsEvent::class, 'pivot_table_name', 'event_1', 'id');
}

public function nextEvent()
{
  return $this->belongsToMany(SportsEvent::class, 'pivot_table_name', 'event_2', 'id');
}

если есть только одно событие, вы можете добавить термин ->first() в конец отношений.

НО, вы также можете просто добавить два столбца, 2018_event и 2019_event и добавить там идентификаторы событий, а затем использовать отношение hasOne.ваш звонок

...