Laravel объединяется с 3 таблицами

Я создаю приложение, подобное Twitter. Существует фид, в котором я хочу показывать только сообщения пользователей, которых я придерживаюсь.

Я пробовал все с помощью соединений, но ничего не работает.

У меня есть 3 таблицы: Users, Followers, Shares

Таблицы выглядят следующим образом:

Пользователи: id

Последователи: user_id, follower_id

Акции: user_id

Мне нужно получить "ВСЕ акции WHERE share.user_id = followers.follower_id" "ANDWHERE followers.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('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;

Ответ 2

В терминах общего синтаксиса 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();

Ответ 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

Вместо

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

Это должно быть

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

потому что в исходном примере "followers.follower_id" интерпретируется как строка.