29

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

我用连接尝试了一切,但似乎没有任何效果。

我有 3 张桌子:Users, Followers,Shares

表格如下所示:

用户id

追随者user_idfollower_id

股份user_id

我需要得到的是“ALL Shares WHERE share.user_id = follower.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();

但它不起作用。

任何帮助表示赞赏:)

4

5 回答 5

51

我相信你的加入是错误的:

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

我还建议您将您的表命名为,而不是使用andfollows感觉更自然一些。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;
于 2013-08-22T19:20:41.607 回答
1

就一般 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();
于 2013-08-22T20:18:10.563 回答
1

代替

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

它应该是

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

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

于 2017-05-25T20:29:13.640 回答
0
$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;

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

于 2016-04-06T09:27:05.117 回答
-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();

看一看

于 2018-11-22T19:59:14.390 回答