Php Laravel上的多层次关系

Php Laravel上的多层次关系,php,laravel,laravel-3,Php,Laravel,Laravel 3,我有这个问题。在Laravel,我有3个模型,即: class Department{ public function coordinations(){ return $this->has_many('Coordination'); } } class Coordination{ public function sites(){ return $this->has_many('Site'); } } class Si

我有这个问题。在Laravel,我有3个模型,即:

class Department{
    public function coordinations(){
        return $this->has_many('Coordination');
    }
}

class Coordination{
    public function sites(){
        return $this->has_many('Site');
    }
}

class Site{
    public function assets(){
        return $this->has_many('FAssets');
    }
}

class FAsset{}
我想显示按部门分组的所有资产。我试着做一些事情,比如:

@foreach($dependencias as $dep)
    <tr>
         <td colspan="8" style="width:100%">Dependencia: {{ $dep->code }} {{ $dep->description }}</td>
    </tr>
@foreach($dep->coordinations()->sites()->assets()->get() as $asset)
...
@foreach($dependencias作为$dep)
Dependencia:{{$dep->code}}{{$dep->description}}
@foreach($dep->coordinations()->sites()->assets()->get()作为$asset)
...
但是我得到了“方法[sites]未在查询类上定义”错误。我一直在寻找一种急切的加载方式,但我不知道它如何在关系上有一个额外的层次

此外,我还考虑查询所有资产,并根据实际协调情况过滤资产,但我认为这将需要大量时间来加载

提前谢谢

class Deparment{
public function department_assets(){
    $assets = array();

    foreach($this->has_many('Coordination')->get() as $coordination){
            foreach($coordination->sites()->get() as $site){
                foreach($site->assets() as $asset)
                {
                    $assets[] = $asset;
                }
            }
        }

    return $assets;
    }
}
现在我们可以

@foreach($dep->department_assets() as $asset)

好吧,现在它的“在非对象上调用成员函数sites()”错误,这就是有空值的时候,不是吗?我觉得很奇怪。这将有助于了解使用它的上下文,这样我就可以更好地理解您要做的事情。它似乎返回的是一个对象数组而不是一个字符串,这意味着您将得到多个模型。是不是因为你和很多人的关系产生了多重结果?由于不能对多个结果执行关系查询,因此通常只能对一个has_-one关系进行查询。您是否尝试用first()方法替换所有这些get()方法?据我所知,has many将返回相关对象模型的多个项。一个部门关联了多个协调,一个协调关联了一个或多个站点,一个站点上可以是一个或多个ASET或项目。我想显示所有放置在每个部门所有不同协调的不同站点上的所有资产。我可以查询资产,但我认为按部门对资产进行分组的直接方法是使用此方法。我现在看到了,似乎我误解了您的意图。因为您一次只能查询一个模型,所以尝试访问ex的多个协调上的关系将不起作用,除非您循环访问它们。我不认为这在有很多关系的情况下是直接可能的,但我相信你可以编写一个简单的循环来绕过它,除非它必须在你的控制器中,因为这种逻辑不适合在视图中。我相信你甚至可以从你的模型中写出来,我可能会尝试在我有空的时候为你写一些东西,因为我现在正在工作。