14

我正在使用 Laravel,这很棒,但我遇到了数据库问题。

假设我们有三个表,如下所示:

表 1:页数

id    |   route   |  title

表 2:元素

id    |   page_id   |  type

表 3:内容

id    |   element_id   |  data

我想对页面进行一次选择,然后选择具有该页面 id 的所有元素,并且对于每个元素,它应该选择具有元素 id 的所有内容行。

我想在 Page 模型中有一个静态load_by_route($route)函数,当被调用时,它将使用路由来加载和返回页面信息以及如上所述的元素和内容。理想情况下,它将返回包含所有这些信息的单个对象/数组。

基本上,我不确定如何将 has_many() 调用链接在一起,以便获得两级关系。

4

2 回答 2

31

查看急切加载。这应该做你想要的。

class Page extends Eloquent {

    public function elements()
    {
        return $this->has_many( 'Element' );
    }

}

class Element extends Eloquent {

    public function contents()
    {
        return $this->has_many( 'Content' );
    }

}

class Content extends Eloquent {}

$page = Page::with( array( 'elements', 'elements.contents' ) )->first();

https://laravel.com/docs/master/eloquent-relationships#eager-loading

于 2013-03-07T22:46:54.543 回答
0

Collin James 的回答为您提供了一个包含所有数据的对象。我来到这里是因为我只是想遍历contents属于一个页面的所有内容。以下是获得此类收藏的方法:

  $page = Page::with('elements.contents.element')->has('elements.contents');

  $contents = [];
  foreach ($page->elements as $element) {
    $contents = $element->contents->merge($temp);
  }

with确保您使用预先加载,并has 确保我们只迭代带有 content 的元素

belongsTo从每个内容元素中,您可以从我们也通过预加载收到的关系中获取元素信息:

class Content extends Eloquent 
{

 public function element()
 {
    returh $this->belongsTo('\App\Page');
 }

}
于 2018-04-24T09:09:22.520 回答