Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Laravel dołącza do 3 stołów

Uważam, że twoje dołączenie jest nieprawidłowe:

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

Proponuję również nazwać tabelę jako follows zamiast tego wydaje się nieco bardziej naturalne, że user has many followers through follows a user has many followers through follows .

Przykład

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

Podejście modelowe

Nie zdawałem sobie sprawy, że używasz DB:: zapytania, a nie modele. Więc poprawiam odpowiedź i zapewniam o wiele większą jasność. Proponuję używać modeli, jest to o wiele łatwiejsze dla tych, którzy zaczynają od frameworka, a zwłaszcza od SQL.

Przykłady modeli:

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');
    }
}

Przykład użycia modelu:

$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;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak przechowywać plik w bazie danych mysql za pomocą blob

  2. Jak edytować plik MySQL my.cnf?

  3. Jak uzyskać liczbę wierszy dotkniętych podczas wykonywania zapytania MySQL z bash?

  4. Instalacja MYSQL z aplikacją .NET winforms

  5. MySQLSyntaxErrorException podczas próby wykonania PreparedStatement