Sql 如何定义HasMulti far关系
假设你有Sql 如何定义HasMulti far关系,sql,laravel,laravel-5,relationships,Sql,Laravel,Laravel 5,Relationships,假设你有 Facility 1------* Section 1------* Session *------1 Event 即,设施有多个部分;每个部门可以举行多次会议;每个会话都属于一个事件 如何将其定义为设施模型中的关系,以检索设施托管的事件的所有唯一实例?我试过这个: class Facility extends Eloquent\Model { public function events() { return $this->hasMany(
Facility 1------* Section 1------* Session *------1 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在(…)中隐式地添加了一个约束(“事件”;“设施id”),一切都变得一团糟
这样做的正确方法是什么?我会避免在模型的关系方法中加入任何逻辑。相反,使用雄辩来加载您的关系,或者一个接一个地加载到设施
模型中。后者更可取
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
模型。您可以使用一些不同的数组帮助程序来提取/提取所有事件。我将避免在模型的关系方法中添加任何逻辑。相反,使用雄辩来加载您的关系,或者一个接一个地加载到设施
模型中。后者更可取
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
模型。您可以使用一些不同的数组帮助程序提取/提取所有事件。这离我最初的目的越近:
我创建了一个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
雄辩模型,最后,在我的类设施中
:
public function events() {
return $this->hasMany('App\FacilityEvent');
}
我期待着看到Laravel唯一的解决方案。在其他框架中,如Yii,我可以做类似的事情,而不需要直接处理数据库。这离我最初的目标越近:
我创建了一个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
雄辩模型,最后,在我的类设施中
:
public function events() {
return $this->hasMany('App\FacilityEvent');
}
我期待着看到Laravel唯一的解决方案。在其他框架(如Yii)中,我可以做类似的事情,而无需直接处理数据库。来自laravel 5.1文档:Has Many-Through“Has Many-Through”关系为通过中间关系访问远程关系提供了方便的捷径。例如,一个国家/地区模型可能有许多通过中间用户模型发布的模型。在本例中,您可以轻松收集给定国家的所有博客帖子。我已经试过了,但在这种情况下,中间有两个关系。事实上,我已经实现了获取会话的hasManyThrough
。不幸的是,hasManyThrough
只有两个级别。您必须为每个模型定义关系,并执行以下操作:$events=Facility::with('sections.sessions.event')->get()代码>来自laravel 5.1文档:通过“通过多个”关系提供了通过中间关系访问远程关系的便捷捷径。例如,一个国家/地区模型可能有许多通过中间用户模型发布的模型。在本例中,您可以轻松收集给定国家的所有博客帖子。我已经试过了,但在这种情况下,中间有两个关系。事实上,我已经实现了获取会话的hasManyThrough
。不幸的是,hasManyThrough
只有两个级别。您必须为每个模型定义关系,并执行以下操作:$events=Facility::with('sections.sessions.event')->get()代码>当然,这是我已经实现的一个选项。但是,正如我在问题中所说的,我希望这些活动有独特的结果。结果是通过RESTAPI使用的,我无法为一个唯一的事件发送数千个会话。我想要的是与给定设施相关的不同事件。我追求的是能够使用('events')执行facility::with
。如果Laravel不允许我这样做,那么我会觉得受到框架的约束,不管它是否是一个好的实践。当然,这是我已经实现的一个选项。但是,正如我在问题中所说的,我希望这些活动有独特的结果。结果是通过RESTAPI使用的,我无法为一个唯一的事件发送数千个会话。我想要的是与给定设施相关的不同事件。我追求的是能够使用('events')执行facility::with
。如果Laravel不允许我这样做,那么我会觉得受到框架的约束,不管这是否是一个好的实践。