Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何定义HasMulti far关系_Sql_Laravel_Laravel 5_Relationships - Fatal编程技术网

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不允许我这样做,那么我会觉得受到框架的约束,不管这是否是一个好的实践。