这就越接近我最初的目的:
我创建了一个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 雄辩的模型,最后,在我的课堂上 Facility :
FactoryEvent
Facility
public function events() { return $this->hasMany('App\FacilityEvent'); }
我期待看到仅限Laravel的解决方案。在其他框架中,例如Yii,我已经能够做到这样的事情,而无需直接在数据库上工作。
我会避免在模型的关系方法中加入任何逻辑。而是使用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 具有嵌套关系的模型。您可以使用一些不同的数组助手来提取/摘取所有事件。
$facility