代码之家  ›  专栏  ›  技术社区  ›  Edwin Krause

与同一模型的一对一关系

  •  0
  • Edwin Krause  · 技术社区  · 6 年前

    我有现有的数据要处理:我得到了一个包含所有sportevents的表 sportevents .

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

    这些sportevents有一个透视表,用于定义与上一年和下一年发生的“相同”sportevent的关系。有点令人困惑的设计,但这里是一张名为eventrelations的表格:我试图用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 模型I将执行以下操作:

    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 回复  |  直到 6 年前
        1
  •  0
  •   Fatemeh Majd    6 年前

    您根本不需要枢轴模型。可以与类本身建立关系。

    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\u event和2019\u event,并在其中添加事件的id,然后使用hasOne关系。你的电话

        2
  •  1
  •   Edwin Krause    6 年前

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

    然后,我将eventrelations表的数据迁移到新列

    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,
        ];
    

    现在可以删除模型eventrelations和表eventrelations。我希望这能帮助某人。。。