如何根据复杂关系从 Laravel 中的多个表中检索特定内容,例如构建类似 Twitter 的提要,根据当前用户关注的用户过滤帖子?

Patricia Arquette
发布: 2024-10-25 07:39:29
原创
138 人浏览过

How can I retrieve specific content from multiple tables in Laravel based on complex relationships, such as building a Twitter-like feed that filters posts based on users a current user follows?

Laravel 连接多个表来过滤内容

在本文中,我们解决了使用 Laravel 构建社交媒体平台时面临的常见挑战:根据多个表之间的复杂关系检索特定内容。我们将使用原始 SQL 查询和 Laravel Eloquent ORM 提供全面的解决方案。

问题陈述

目标是构建一个类似 Twitter 的提要来显示帖子仅来自当前用户关注的用户。为此,我们需要根据以下条件过滤“Shares”表:

  • Share.user_id 必须等于 Followers.follower_id
  • Followers.user_id 必须等于to Users.id

SQL 解决方案

虽然提供的原始 SQL 查询可能看起来是正确的,但需要对连接顺序和条件进行细微调整正常工作。以下更正后的 SQL 查询有效地连接三个表并应用指定的过滤:

$shares = DB::table('shares')
    ->join('users', 'users.id', '=', 'shares.user_id')
    ->join('followers', 'followers.user_id', '=', 'users.id')
    ->where('followers.follower_id', '=', 3)
    ->get();
登录后复制

或者,使用 Eloquent ORM 提供了一种更优雅和封装的方法。这是一个基于模型的解决方案:

User.php(模型)

public function shares() {
    return $this->hasMany('Share');
}

public function followers() {
    return $this->belongsToMany('User', 'follows', 'user_id', 'follower_id');
}

public function followees() {
    return $this->belongsToMany('User', 'follows', 'follower_id', 'user_id');
}
登录后复制

Share.php(模型)

public function user() {
    return $this->belongsTo('User');
}
登录后复制

Controller.php(控制器)

$my = User::find('my_id');

$shares = Share::with('user')
    ->join('follows', 'follows.user_id', '=', 'shares.user_id')
    ->where('follows.follower_id', '=', $my->id)
    ->get();

foreach ($shares as $share) {
    echo $share->user->username;
}
登录后复制

这种方法提供了更灵活和可维护的解决方案,确保数据完整性和高效查询。

以上是如何根据复杂关系从 Laravel 中的多个表中检索特定内容,例如构建类似 Twitter 的提要,根据当前用户关注的用户过滤帖子?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!