sql >> Databasteknik >  >> RDS >> Mysql

Laravel sammanfogar med 3 bord

Jag tror att din anslutning är felaktig:

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

Jag föreslår också att du namnger din tabell som follows istället känns det lite mer naturligt att säga att user has many followers through follows och user has many followees through follows .

Exempel

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

Modellmetoden

Jag insåg inte att du använde DB:: frågor och inte modeller. Så jag fixar svaret och ger mycket mer klarhet. Jag föreslår att du använder modeller, det är mycket lättare för dem som börjar med ramverket och speciellt SQL.

Exempel på modeller:

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

Exempel på modellanvändning:

$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. Uppdatera SQL Server-tabeller med färre avbrott med hjälp av partitionsväxling

  2. MySQL får första icke-nullvärdet efter grupp av

  3. RODBC odbcDriverConnect() Anslutningsfel

  4. Konvertera tidsstämpel datatyp till unix tidsstämpel Oracle