sql >> Database >  >> RDS >> Mysql

Laravel join met 3 tafels

Ik denk dat je deelname verkeerd is:

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

Ik raad je ook aan om je tabel een naam te geven als follows in plaats daarvan voelt het een beetje natuurlijker om te zeggen dat user has many followers through follows en user has many followees through follows .

Voorbeeld

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

Modelbenadering

Ik wist niet dat je DB:: . gebruikte vragen en geen modellen. Dus ik fixeer het antwoord en geef veel meer duidelijkheid. Ik raad je aan modellen te gebruiken, het is een stuk makkelijker voor degenen die beginnen met het framework en speciaal SQL.

Voorbeeld van modellen:

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

Voorbeeld van modelgebruik:

$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. Laatste afzonderlijke set records ophalen

  2. mysql natuurlijke sortering

  3. MySQL SELECT meest frequent per groep

  4. Aanbevolen Intel-processors voor SQL Server 2014 – maart 2015