Laravel 加入 3 个表
Posted
技术标签:
【中文标题】Laravel 加入 3 个表【英文标题】:Laravel join with 3 Tables 【发布时间】:2013-08-25 16:03:14 【问题描述】:我正在构建一个类似 Twitter 的应用程序。有一个 Feed,我只想在其中显示我关注的用户的帖子。
我用连接尝试了所有方法,但似乎没有任何效果。
我有 3 张桌子:Users
、Followers
、Shares
表格如下所示:
用户:id
关注者:user_id
、follower_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 follows
和user 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 个表的主要内容,如果未能解决你的问题,请参考以下文章