雄辩地从多对多关系中获取数据

时间:2019-11-13 19:38:38

标签: php laravel laravel-5 eloquent

我有两个模型,storedvd有多对多的关系

dvd模型:

    public function stores() {
        return $this->belongsToMany('App\store');
    }

store模型:

    public function dvds ( ) {
        return $this->belongsToMany('App\dvd');
    }

然后,在控制器中,当我需要从两个模型中获取数据时,我将使用如下代码:

    $res_store = store::orderBy("id","desc")->get();
    foreach( $res_store as $row ) {
        $dvds = $row->dvds()->get();
        foreach ($dvds as $dvd) {
            // echo columns here
        }            
    }

这有效,但是我的问题是,我是以正确的方式执行此操作吗?我问是因为似乎2个循环对于这个简单的关系效率低下。

1 个答案:

答案 0 :(得分:2)

不,这不是正确的方法。

遍历$store时,可以通过$dvd访问关联的$store->dvds记录;无需调用$row->dvds()->get(),因为它正在执行与$store->dvds相同结果的新查询。完整代码应为:

$stores = Store::with("dvds")->orderBy("id", "DESC")->get();
foreach($stores AS $store){
  foreach($store->dvds AS $dvd){
    ... // Do something with `$dvd`
  }
}

::with("dvds")子句称为“快速加载”,可防止$store->dvds在后​​台执行另一个查询。

另外,请正确命名您的模型。 PHP中的类为StudlyCase,因此StoreDVD,而不是storedvd