gpt4 book ai didi

php - 如何在 Laravel 中列出嵌套表格中的所有项目

转载 作者:可可西里 更新时间:2023-11-01 01:03:46 26 4
gpt4 key购买 nike

我正在使用 Laravel 的 Eloquent ORM,但在急切加载要显示的项目时遇到了问题。

场景如下:

  • 用户关注博客
  • 博客有帖子

我有一个名为 Relationships 的数据库表,该表用于存储用户 ID 和博客 ID,以显示哪个用户正在关注哪个博客。我有一个用于描述博客的博客表,还有一个用于帖子的表。关系表将是我的数据透视表,用于将用户与博客表连接在一起。现在,我需要在列表中列出用户关注的所有博客中的所有帖子。

这是我的用户模型:

public function following() {
return $this->has_many_and_belongs_to('Blog', 'relationships', 'user_id', 'blog_id');
}

这是我的博客模型:

public function followers() {
return $this->has_many_and_belongs_to('User', 'relationships', 'blog_id', 'user_id');
}
public function posts() {
return $this->has_many('Post');
}

这就是我尝试检索列表中的帖子的方式:

$posts = User::with(array('following', 'following.posts'))
->find($user->id)
->following()
->take($count)
->get();

这段代码只列出了实际的博客,我需要他们的帖子。

感谢您的帮助,如果您需要更多详细信息,请告诉我。

解决方案:

我稍微修改了下面接受的答案,我决定使用 JOIN 将 SQL 调用量减少到仅 1 次调用。在这里:

$posts = Post::join('blogs', 'posts.blog_id', '=', 'blogs.id')
->join('relationships', 'blogs.id', '=', 'relationships.blog_id')
->select('posts.*')
->where('relationships.user_id', '=', $user->id)
->order_by('posts.id', 'desc')
->take($count)
->get();

最佳答案

这是原生 Eloquent 方法无法实现的。但是您可以使用一些 Fluent 方法来连接这些表。例如:

在此处编辑:我已将预先加载添加到Post 查询。

$user = User::find(1);
$posts = Post::with('blog') // Eager loads the blog this post belongs to
->join('blogs', 'blogs.id', '=', 'posts.blog_id')
->join('relationships', 'relationships.blog_id', '=', 'blogs.id')
->where('relationships.user_id', '=', $user->id)
->order_by('posts.id', 'desc') // Latest post first.
->limit(10) // Gets last 10 posts
->get('posts.*');

foreach ($posts as $post) {
print($post->title);
}

例如,如果您还需要此类用户正在关注的所有博客的列表以显示在侧边栏上。你可以 DYI 而不是依赖 Eloquent,它应该更快并且更可定制。例如:

$user = User::with('following')->find(1);

// This creates a dictionary for faster performance further ahead
$dictionary = array();
foreach ($user->following as $blog) {
$dictionary[$blog->id] = $blog;
}

// Retrieves latest 10 posts from these blogs that he follows
// Obs: Notice the array_keys here
$posts = Post::where_in('blog_id', array_keys($blog_ids))
->order_by('posts.id', 'desc')
->limit(10)
->get();

// Hydrates all posts with their owning blogs.
// This avoids loading the blogs twice and has no effect
// on database records. It's just a helper for views.
foreach ($posts as $post) {
$post->relationships['blog'] = $dictionary[$post->blog_id];
}

在 View 中:

foreach ($user->following as $blog) {
print($blog->title);
}

foreach ($posts as $post) {
print($post->title . ' @'. $post->blog->title);
}

关于php - 如何在 Laravel 中列出嵌套表格中的所有项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16258056/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com