Laravel 4.1:如何分散雄辩的热切关系?

时间:2014-01-03 22:10:01

标签: php laravel pagination eloquent

有关旧的L3渴望加载的分页的问题,而不是使用雄辩的。但是我想利用雄辩来获得与分页的热切关系。

主要模式:与帖子有一对多关系的主题, 因此,主题有很多帖子。我使用此函数获取所有数据:

public function findById($id)
{
    return $this->topic->with('posts', 'posts.user', 'posts.user.profile')
                       ->find($id);
}

后来我循环显示所有结果,但它们没有分页:

@foreach($topic->posts as $post)
... unpaginated content ...
@endforeach

所以,我可以制定一个解决方法并单独选择所有具有$ id主题的帖子并使用 - > paginate()而不是 - > get()并且会得到分页$ pot,

  1. 但是有可能使用分页的热切加载关系帖子吗?怎么办呢?

2 个答案:

答案 0 :(得分:32)

澄清一些事情:分页急切加载的关系有点误解。渴望加载的重点是尽可能少地查询所有关系。如果要检索10个主题,所有主题都有35个帖子,则只需要两个查询。甜!

也就是说,分散一个急切的关系并不会起作用。当出现急切加载时,请考虑两种情况:

  1. 您想要检索和列出主题,并列出每个主题的前五个帖子。大!渴望装载是完美的。现在,您不希望在这样的页面上对热切的帖子进行分页,所以没关系。

  2. 您加载了一个主题,并且想要为该主题分页。大!比较容易做到。但是,如果您已经热切地加载了属于此主题的所有帖子,那么您很可能会检索到许多您不需要的额外资源。因此,急切加载实际上伤害你。

  3. 那说,有两种可能的解决方案:

    选项1:创建一个自定义访问器,用于对Eloquent关系进行分页。

    /**
     * Paginated posts accessor. Access via $topic->posts_paginated
     * 
     * @return \Illuminate\Pagination\Paginator
     */
    public function getPostsPaginatedAttribute()
    {
        return $this->posts()->paginate(10);
    }
    

    优点:很容易分页;不干扰正常职位关系 缺点:急切加载帖子不会影响此访问者;运行它将在急切加载的查询之上创建两个额外的查询。

    选项2:分散由热切关系关系返回的帖子集合。

    /**
     * Paginated posts accessor. Access via $topic->posts_paginated
     * 
     * @return \Illuminate\Pagination\Paginator
     */
    public function getPostsPaginatedAttribute()
    {
        $posts = $this->posts;
    
        // Note that you will need to slice the correct array elements yourself.
        // The paginator class will not do that for you.
    
        return \Paginator::make($posts, $posts->count(), 10);
    }
    

    优点:使用急切的关系;不会产生任何其他疑问 缺点:无论当前页面如何,都必须检索所有元素(慢);必须手动构建当前页面元素。

答案 1 :(得分:4)

您可能需要查看以下内容:

$category = 'Laravel';

$posts = Post::with('user', 'category')->whereHas('category', function($query) use ($category) {
$query->where('name', '=', $category);
})->paginate();

作者:Zenry: 来源:http://laravel.io/forum/02-25-2014-eager-loading-with-constrains-load-post-based-on-category-name

希望这有帮助