【问题标题】:Paginate an eager loaded relationship对急切加载的关系进行分页
【发布时间】:2013-03-27 06:43:40
【问题描述】:

我正在使用 Laravel 3.x。

Post::with( array('blogs' => function($query) { $query->where('user_id', '=', Auth::user()->id); } ))->get();

如何给帖子分页?

【问题讨论】:

  • 简单的答案是你不能那样做。你能更好地解释你想要达到的目标吗?正在尝试根据post->blog->user_id 过滤帖子,还是尝试获取所有 帖子并只是急切地加载属于用户的博客?每个人可能有完全不同的答案:)
  • 我想列出指定博客(blog->user_id)的所有帖子。

标签: php laravel


【解决方案1】:

从上面的反馈看来,急切加载并不是您想要的。试试这个。

Post::where( 'user_id', '=', Auth::user()->id )->paginate( 10 );

或者您可以向 User 模型添加一个 posts 方法。

public function posts()
{
    return $this->has_many( 'Post' );
}

然后用它来获取用户的帖子。

Auth::user()->posts()->paginate( 10 );

【讨论】:

  • 我相信这不能回答 OP 的问题。他希望将所有帖子发布到用户博客。并不是用户发布的所有帖子。
【解决方案2】:

FakeHeal,

假设$user->has_one('blog'),你可以简单地使用Laravel魔术关系getter:

$user = Auth::user();
$user->blog->posts();

如果不是这种情况并且user->has_many('blog'),您需要使用 JOIN 来检索在所有该用户博客上发布的所有帖子。

$user = Auth::user();
$posts = Posts::join('blogs', 'blogs.id', '=', 'posts.blog_id')
    ->where('blogs.user_id', '=', $user->id)
    ->get('posts.*');

【讨论】:

    【解决方案3】:

    这是我想出的解决方案。一个用户可以拥有多个博客,一篇文章可以属于多个博客。

        /**
        * Get all posts by a user for all blogs.
        * @return paginated posts.
        */
        public static function get_posts_for_user($user_id, $limit)
        {
            return Post::left_join('blog_post', 'posts.id', '=', 'blog_post.post_id')
                    ->join('blogs', 'blogs.id', '=', 'blog_post.blog_id')
                    ->where('blogs.user_id', '=', $user_id)
                    ->paginate($limit);
        }
    

    【讨论】:

      猜你喜欢
      • 2017-09-19
      • 2021-04-28
      • 1970-01-01
      • 1970-01-01
      • 2021-12-01
      • 1970-01-01
      • 2014-10-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多