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

Я создаю приложение, похожее на Twitter. Есть 9X_join канал, в котором я хочу отображать только 9X_sql-syntax сообщения пользователей, на которых я подписан.

Я 9X_laravel пробовал все с соединениями, но ничего не 9X_dbms работает.

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

Таблицы 9X_sql-query выглядят так:

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

Подписчики: user_id, follower_id

Поделились: user_id

Мне нужно получить 9X_mysqldump "ВСЕ общие ресурсы, ГДЕ share.user_id = followers.follower_id" "ANDWHERE 9X_mysqlclient followers.user_id = users.id"

Предположим, что 9X_db значение 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(); 

Но 9X_sql-select это не работает.

Любая помощь приветствуется 9X_mysqlclient :)

30
0
3
Общее количество ответов: 3

Ответ #1

Ответ на вопрос: Laravel объединяется с 3 таблицами

Я считаю, что ваше соединение неверно:

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

Я 9X_sql-select также предлагаю вам вместо этого называть 9X_mysql-query свою таблицу follows, кажется более естественным 9X_sql-join сказать 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(); 

Модельный подход

Я не знал, что вы используете 9X_sql-syntax запросы DB::, а не модели. Так что я исправляю 9X_join ответ и даю больше ясности. Я предлагаю 9X_mysql-query вам использовать модели, это намного проще 9X_jointable для тех, кто начинает с фреймворка и особенно 9X_dbms с 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; 

54
1

  • Да, у меня проблемы с именованием .. Итак, ...

Ответ #2

Ответ на вопрос: Laravel объединяется с 3 таблицами

С точки зрения общего синтаксиса MySQL лучше 9X_sql-syntax всего написать:

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 

вернет набор данных обо всех 9X_laravel подписчиках и их соответствующих репостах.

Я 9X_database считаю, что вам нужно следующее в Laravel

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

1
0

Ответ #3

Ответ на вопрос: Laravel объединяется с 3 таблицами

Вместо

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

Так и должно быть

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

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

1
0