sql >> Databáze >  >> RDS >> Mysql

Laravel spoj se 3 stoly

Věřím, že vaše připojení je špatné:

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

Také vám doporučuji pojmenovat tabulku jako follows místo toho mi přijde trochu přirozenější říct, že user has many followers through follows a user has many followers through follows .

Příklad

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

Modelový přístup

Neuvědomil jsem si, že používáte DB:: dotazy a ne modely. Takže opravuji odpověď a poskytujem mnohem větší jasnost. Doporučuji vám používat modely, je to mnohem jednodušší pro ty, kteří začínají s frameworkem a speciálně SQL.

Příklad modelů:

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

Příklad použití 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. Nelze použít UPDATE s klauzulí OUTPUT, když je na stole spouštěč

  2. Výsledkem tiskového dotazu je tabulka

  3. Jak uložit Java Instant v databázi MySQL

  4. CTE získat všechny děti (potomky) rodiče