假设你有
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 (...)
),一切都搞砸了。
这样做的正确方法是什么?
答案 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,我已经能够做到这样的事情,而无需直接在数据库上工作。