如何定义hasMany远关系

时间:2015-08-20 15:28:05

标签: sql laravel laravel-5 relationships

假设你有

Facility  1------*  Section  1------*  Session  *------1  Event

即,设施有很多部分;每个部分可以举行多次会议;每个会话都属于一个事件。

如何将此定义为Facility模型中的关系,以检索设施所托管的Event的所有唯一实例?我试过这个:

class Facility extends Eloquent\Model {
    public function events() {
        return $this->hasMany('Event')
            ->join('session', 'session.event_id', '=', 'event.id')
            ->join('section', 'section.id', '=', 'session.section_id')
            ->join('facility', 'facility.id', '=', 'section.facility_id');
    }
}

我不知道我是否与此非常接近; Laravel隐式地添加了一个约束("events"."facility_id" in (...)),一切都搞砸了。

这样做的正确方法是什么?

2 个答案:

答案 0 :(得分:0)

我会避免在模型的关系方法中加入任何逻辑。而是使用eloquent来加载您的关系,一个接一个地加载或急切加载到Facility模型中。后者是可取的。

class Facility extends Eloquent\Model 
{
    public function sections() 
    {
        return $this->hasMany('Section');
    }
}

只需确保每个模型都设置了正确的关系,这样您就可以链接一个急切的负载。如:

class Section extends Eloquent\Model 
{
    public function sessions() 
    {
        return $this->hasMany('Session');
    }
}

然后,当您加载关系时,您可以使用点符号来急切加载它们。

$facility = Facility::with('sections.sessions.event')->get();

$facility现在将包含具有嵌套关系的Facility模型。您可以使用一些不同的数组助手来提取/摘取所有事件。

答案 1 :(得分:0)

这是我的最初目的:

我创建了一个SQL视图:

CREATE VIEW facility_events AS
  SELECT DISTINCT ON (e.id) e.id,
    e.name,
    e.created_at,
    e.updated_at,
    f.id AS facility_id
  FROM events e
    JOIN sessions s ON e.id = s.event_id
    JOIN sections_extended fse ON s.section_id = fse.id
    JOIN facilities f ON fse.root_facility_id = f.id;

然后我创建了相应的FactoryEvent Eloquent模型,最后在我的班级Facility中创建:

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

我期待看到仅限Laravel的解决方案。在其他框架中,例如Yii,我已经能够做到这样的事情,而无需直接在数据库上工作。