isset Biz burada findOrFail($id) diyerek tekil kayıt istediğimizi zaten belli ediyoruz. O yüzden $user üzerine where uygulayamazsınız. get() ile çekerseniz uygularsınız ama bu sefer de dönen Collection olduğu için Collection::where kullanmanız gerekir.
wherePivot() Builder içinde bir yöntem değil, Illuminate\Database\Eloquent\Relations\BelongsToMany içerisinde bir yöntem. Bu yüzden sadece BelongsToMany ilişkisi dönen bir yerde kullanabilirsiniz, yani ilişkiyi kurduğunuz ya da çağırdığınız yerde:
public function teams(): BelongsToMany
{
return $this->belongsToMany(Team::class);
}
public function activeTeams(): BelongsToMany
{
return $this->belongsToMany(Team::class)
->wherePivot('active', true);
}
ya da
$teams = $user->teams() // Burası Eloquent\Builder değil Relation\BelongsToMany dönüyor
->wherePivot('active', true) // O yüzden burada wherePivot kullanabiliyoruz.
->get();
Pivot alana göre filtreleme yaparak kayıtları çekmek için ise zaten whereHas ya da whereRelation kullanıyoruz:
$usersInAnActiveTeam = User::whereRelation('teams', 'active', '=', true)
->get();
$usersInAnActiveTeam = User::whereHas('teams' => function($query) {
// Pivot tablo da sorguya dahil edildiği için where ile kullanabiliyorum.
// Burada istek atılan tablo pivot ile join olmuş teams tablosu olduğu için
// yine aynı şekilde wherePivot yok.
$query->where('active', true);
})
->get();
SELECT *
FROM "teams"
INNER JOIN "team_user"
ON "teams"."id" = "team_user"."team_id"
WHERE "users"."id" = "team_user"."user_id"
AND "team_user"."active" = true # where/whereHas/wherePivot burada