【问题标题】:Laravel join with 3 TablesLaravel 加入 3 个表
【发布时间】:2013-08-25 16:03:14
【问题描述】:

我正在构建一个类似 Twitter 的应用程序。有一个 Feed,我只想在其中显示我关注的用户的帖子。

我用连接尝试了所有方法,但似乎没有任何效果。

我有 3 张桌子:UsersFollowersShares

表格如下所示:

用户id

关注者user_idfollower_id

分享user_id

我需要得到的是“ALL Shares WHERE share.user_id = Followers.follower_id” "ANDWHERE follower.user_id = users.id"

假设 users.id 是 3,我试过这个:

$shares = DB::table('shares')
        ->leftjoin('followers', 'shares.user_id', '=', 'followers.follower_id')
        ->leftjoin('users', 'followers.user_id', '=', 'users.id')
        ->where('users.id', 3)
        ->where('shares.user_id', 'followers.follower_id')
        ->get();

但它不起作用。

任何帮助表示赞赏:)

【问题讨论】:

  • 理想情况下,您应该以与当前设置相反的顺序检索您寻找的数据。您不会找到所有共享然后倒退。首先找到您的追随者,然后找到这些追随者拥有的份额。它在某些方面可能无关紧要,但在语法上肯定更有意义。

标签: mysql sql database join laravel


【解决方案1】:
$shares = DB::table('users')
->leftjoin('followers', 'users.user_id', '=', 'followers.follower_id')
->leftjoin('shares', 'shares.user_id', '=', 'users.id')
->where('users.id', 3)
->get();

看看

【讨论】:

  • 您应该编辑您的答案并描述它如何或为什么回答问题
【解决方案2】:

代替

    ->where('shares.user_id', 'followers.follower_id')

应该是

    ->whereRaw('shares.user_id=followers.follower_id')

因为在原始示例中,“followers.follower_id”被解释为字符串。

【讨论】:

  • 这对我有用...我遇到了额外的重复记录问题,该记录不存在,在我的加入中弹出。我有一个引用 rate_id 和 user_id 的一天记录,我想显示来自天数、费率和用户的数据。我一直有两天弹出,其中一个不存在,因为用户有第二个费率,但没有一天。我称 position_user 关系比率是为了更好地理解我的软件。 ->whereRaw('days.rate_id = position_user.id')
【解决方案3】:
$data[shares] = DB::table('shares')
        ->leftjoin('followers', 'shares.user_id', '=', 'followers.follower_id')
        ->leftjoin('users', 'users.id', '=', 'users.id')
        ->where('users.id','=', 3)
        ->get();

查看结果。

print_r($data[shares]);die;

对于其他查询只需描述您的表格

【讨论】:

    【解决方案4】:

    我认为你的加入是错误的:

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

    我还建议您将表命名为follows,而不是使用user has many followers through followsuser has many followees through follows 感觉更自然一些。

    示例

    $shares = DB::table('shares')
        ->join('users', 'users.id', '=', 'shares.user_id')
        ->join('follows', 'follows.user_id', '=', 'users.id')
        ->where('follows.follower_id', '=', 3)
        ->get();
    

    模型方法

    我没有意识到您使用的是DB:: 查询而不是模型。所以我正在修正答案并提供更多的清晰度。我建议你使用模型,对于那些从框架开始,特别是 SQL 开始的人来说更容易。

    模型示例:

    class User extends Model {
        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');
        }
    }
    class Share extends Model {
        public function user() {
            return $this->belongsTo('User');
        }
    }
    

    模型使用示例:

    $my = User::find('my_id');
    
    // Retrieves all shares by users that I follow
    // eager loading the "owner" of the share
    $shares = Share::with('user')
        ->join('follows', 'follows.user_id', '=', 'shares.user_id')
        ->where('follows.follower_id', '=', $my->id)
        ->get('shares.*'); // Notice the shares.* here
    
    // prints the username of the person who shared something
    foreach ($shares as $share) {
        echo $share->user->username;
    }
    
    // Retrieves all users I'm following
    $my->followees;
    
    // Retrieves all users that follows me
    $my->followers;
    

    【讨论】:

    • 嗯,对我来说这似乎是正确的,但不知何故它不起作用。我将followers.user_id 更改为followers.follower_id 和followers.follower_id 更改为followers.user_id,但现在它只返回所有共享
    • 你是在followers.user_id上存储被关注用户的id,还是在存储关注用户的id?您使用的是leftjoin 还是join?还要确保在 where 子句中包含 =
    • followers.user_id 是关注的用户。 follower.follower_id 因此是被关注用户的 id。我正在使用加入,我认为“=”是默认的,如果没有设置,但我现在已经设置了
    • 应该是相反的,至少会说英语。
    • 是的,我的命名有些麻烦..所以我会照你说的做,表“Follows”和“follower_id”是关注“user_id”的用户。对吗?
    【解决方案5】:

    就一般的MySQL语法而言,最好这样写:

    SELECT * FROM USER a JOIN FOLLOWERS b ON (a.id = b.user_id) JOIN SHARES c on (b.follower_id = c.user_id) WHERE a.id = 3
    

    将返回所有关注者及其各自份额的数据集。

    我相信你会在 Laravel 中想要以下内容

    DB::table('USER')
      ->join('FOLLOWERS', 'USER.id', '=', 'FOLLOWERS.user_id')
      ->join('SHARES', 'FOLLOWERS.follower_id', '=', 'SHARES.user_id')
      ->where('USER.id', 3)
      ->get();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-06
      • 1970-01-01
      • 2021-12-11
      • 1970-01-01
      • 2019-10-03
      • 2017-11-07
      • 2021-03-05
      • 2011-07-20
      相关资源
      最近更新 更多