Sql Join Nedir ?
İlk olarak join ifadesinden bahsetmek istiyorum. Join ifadesi sql sorgularında kullanılan ve iki ya da daha fazla tabloyu birleştirmek için kullanılan bir ifadedir. Çoğu programlama dilinde veritabanından veri çekerken join işlemi kullanılır.
Laravel inner join Kullanımı
inner join birleştirmek istediğimiz tablolarda ortak alanları bulup, eşleşen sonuçları tek bir tablo halinde bize veren join türüdür. Laravelde kullanımıu ise şu şekildedir. Mesela 2 tane tablomuz olsun okul ve ogrenci adında. Bir öğrencinin hangi okula ait olduğunu bulmak için temel olarak şöyle bir sorgu hazırlayabiliriz.
use Illuminate\Support\Facades\DB; $ogrenci= DB::table('ogrenci') ->join('okul', 'ogrenci.okul_id', '=', 'okul.id') ->select('users.*', 'contacts.phone', 'orders.price') ->get();
Laravel Left join ve Right join Kullanımı
Left join sol yani ilk tablodaki verileri sağ yani ikinci tablodaki verilerle eşleştirir. Eğer sağ tablodaki değerin sol tabloda karşılığı yoksa sütun değerinin karşısına null ifadesi getirilir.
$kisi= DB::table('kisi') ->leftJoin('sehir', 'kisi.sehir_id', '=', 'sehir.id') ->get();
Right join ise left joinin tam tersi işlem yapar. Sağ tablodaki verileri sol tablo ile eşleştirir. Eğer sağ tablodaki herhangi bir değer sol tabloda bulunmazsa değeri null olur.
$kisi = DB::table('kisi') ->rightJoin('okul', 'kisi.okul_id', '=', 'okul.id') ->get();
Laravel Cross Join Kullanımı
Cross Join işlemi ise iki tabloyu birleştirirken iki tablo arasında tüm eşleştirmeleri listeler yani çapraz birleştirir yani kartezyen çarpımını alır. Soldaki tablodaki her satır değerine karşılık sağdaki tablonun tüm satır değerlerini döndürme işlemi gerçekleştirir. Laravelde kullanımı ise şu şekildedir.
$sizes = DB::table('sizes') ->crossJoin('colors') ->get();
Laravel Advanced Join Kullanımı
Laravel yazarken join işlemlerimizi daha spesifik şekilde yapabiliriz. join metoduna callback fonksiyon ekleyerek join üzerinde daha değişik işlemler yapabiliriz. Temel kullanımı şu şekildedir.
DB::table('users') ->join('contacts', function ($join) { $join->on('users.id', '=', 'contacts.user_id')->orOn(...); }) ->get();
Birleştirmelerinizde “where” ifadesi kullanmak istiyorsanız, JoinClause örneği tarafından sağlanan where ve orWhere yöntemlerini kullanabilirsiniz. İki sütunu karşılaştırmak yerine, bu yöntemler sütunu bir değerle karşılaştıracaktır:
DB::table('users') ->join('contacts', function ($join) { $join->on('users.id', '=', 'contacts.user_id') ->where('contacts.user_id', '>', 5); }) ->get();
Laravel Subquery (Alt sorgu) Join Kullanımı
Bir sorguyu bir alt sorguya bağlamak için joinSub, leftJoinSub ve rightJoinSub yöntemlerini kullanabilirsiniz. Bu yöntemlerin her biri üç argüman alır: alt sorgu, tablo diğer adı ve ilgili sütunları tanımlayan bir kapatma. Aşağıdaki örnekte, her kullanıcı kaydının, kullanıcının en son yayınlanan blog gönderisinin create_at zaman damgasını da içerdiği bir kullanıcı koleksiyonu alacağız:
$latestPosts = DB::table('posts') ->select('user_id', DB::raw('MAX(created_at) as last_post_created_at')) ->where('is_published', true) ->groupBy('user_id'); $users = DB::table('users') ->joinSub($latestPosts, 'latest_posts', function ($join) { $join->on('users.id', '=', 'latest_posts.user_id'); })->get();
Laravel Union Kullanımı
Query builder ayrıca iki veya daha fazla sorguyu birlikte “join” yapmak için uygun bir yöntem sağlar. Örneğin, bir başlangıç sorgusu oluşturabilir ve onu daha fazla sorguyla birleştirmek için union yöntemini kullanabilirsiniz.
use Illuminate\Support\Facades\DB; $first = DB::table('users') ->whereNull('first_name'); $users = DB::table('users') ->whereNull('last_name') ->union($first) ->get();
Union yöntemine ek olarak, query builder bir unionAll yöntemi sağlar. unionAll yöntemi kullanılarak birleştirilen sorgularda aynı olan sonuçlar kaldırılmaz. unionAll yöntemi, union yöntemiyle aynı metoda sahiptir.