Laravel 加入 3 个表

Posted

技术标签:

【中文标题】Laravel 加入 3 个表【英文标题】:Laravel join with 3 Tables 【发布时间】: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();

但它不起作用。

任何帮助表示赞赏:)

【问题讨论】:

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

【讨论】:

以上是关于Laravel 加入 3 个表的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.1 - 3个表之间的数据透视表

Laravel 5 - 如何在 3 个表之间建立关系?

加入彼此不相关的表laravel

Laravel 连接 3 个表

慢查询分组,加入MYSQL laravel

如何在laravel的索引中获得3个表数据?