Veritabanı Kullanımı (Laravel Veritabanı Bileşenine Dayalı)

Tüm Satırları Alma

<?php
namespace app\controller;

use support\Request;
use support\Db;

class UserController
{
    public function all(Request $request)
    {
        $users = Db::table('users')->get();
        return view('user/all', ['users' => $users]);
    }
}

Belirli Sütunları Alma

$users = Db::table('user')->select('name', 'email as user_email')->get();

Tek Satır Alma

$user = Db::table('users')->where('name', 'John')->first();

Tek Sütun Alma

$titles = Db::table('roles')->pluck('title');

Belirli id alanının değerini indeks olarak belirtme

$roles = Db::table('roles')->pluck('title', 'id');

foreach ($roles as $id => $title) {
    echo $title;
}

Tek Değer Alma (Alan)

$email = Db::table('users')->where('name', 'John')->value('email');

Benzersiz Değer Alma

$email = Db::table('user')->select('nickname')->distinct()->get();

Sonuçları Parça Parça Alma

Eğer binlerce veritabanı kaydını işlemeniz gerekiyorsa, tüm bu verileri tek seferde okumak zaman alıcı olabilir ve bellek aşımlarına yol açabilir, bu durumda chunkById yöntemini kullanmayı düşünebilirsiniz. Bu yöntem, sonuç kümesinin küçük bir parçasını alır ve bunu kapatma fonksiyonuna işler. Örneğin, tüm users tablosundaki verileri 100 kayıt şeklinde kesip işleyebiliriz:

Db::table('users')->orderBy('id')->chunkById(100, function ($users) {
    foreach ($users as $user) {
        //
    }
});

Kapatma içinde false döndürerek parça sonuç alımını durdurabilirsiniz.

Db::table('users')->orderBy('id')->chunkById(100, function ($users) {
    // Kayıtları işle...

    return false;
});

Dikkat: Geri çağrıda veri silmeyin, bu bazı kayıtların sonuç kümesine dahil edilmemesine yol açabilir.

Toplama

Sorgu oluşturucusu, count, max, min, avg, sum gibi çeşitli toplama yöntemlerini de sağlar.

$users = Db::table('users')->count();
$price = Db::table('orders')->max('price');
$price = Db::table('orders')->where('finalized', 1)->avg('price');

Kayıtların Varlığını Kontrol Etme

return Db::table('orders')->where('finalized', 1)->exists();
return Db::table('orders')->where('finalized', 1)->doesntExist();

Ham İfade

Prototip

selectRaw($expression, $bindings = [])

Bazen sorgularda ham ifadeler kullanmanız gerekebilir. selectRaw() ile bir ham ifade oluşturabilirsiniz:

$orders = Db::table('orders')
                ->selectRaw('price * ? as price_with_tax', [1.0825])
                ->get();

Ayrıca whereRaw() orWhereRaw() havingRaw() orHavingRaw() orderByRaw() groupByRaw() ham ifadeler için yöntemler de sağlanır.

Db::raw($value) de bir ham ifade oluşturmak için kullanılır, ancak bağlama parametreleri sağlamaz, bu nedenle kullanırken SQL enjeksiyonu sorunlarına dikkat etmeniz gerekir.

$orders = Db::table('orders')
                ->select('department', Db::raw('SUM(price) as total_sales'))
                ->groupBy('department')
                ->havingRaw('SUM(price) > ?', [2500])
                ->get();

Join İfadeleri

// join
$users = Db::table('users')
            ->join('contacts', 'users.id', '=', 'contacts.user_id')
            ->join('orders', 'users.id', '=', 'orders.user_id')
            ->select('users.*', 'contacts.phone', 'orders.price')
            ->get();

// leftJoin            
$users = Db::table('users')
            ->leftJoin('posts', 'users.id', '=', 'posts.user_id')
            ->get();

// rightJoin
$users = Db::table('users')
            ->rightJoin('posts', 'users.id', '=', 'posts.user_id')
            ->get();

// crossJoin    
$users = Db::table('sizes')
            ->crossJoin('colors')
            ->get();

Union İfadeleri

$first = Db::table('users')
            ->whereNull('first_name');

$users = Db::table('users')
            ->whereNull('last_name')
            ->union($first)
            ->get();

Where İfadeleri

Prototip

where($column, $operator = null, $value = null)

Birinci parametre sütun adıdır, ikinci parametre herhangi bir veritabanı sistemi tarafından desteklenen bir operatördür, üçüncü parametre ise bu sütunun karşılaştıracağı değerdir.

$users = Db::table('users')->where('votes', '=', 100)->get();

// Operatör eşitlik olduğunda atlanabilir, bu ifade yukarıdakiyle aynıdır
$users = Db::table('users')->where('votes', 100)->get();

$users = Db::table('users')
                ->where('votes', '>=', 100)
                ->get();

$users = Db::table('users')
                ->where('votes', '<>', 100)
                ->get();

$users = Db::table('users')
                ->where('name', 'like', 'T%')
                ->get();

Ayrıca, where fonksiyonuna koşul dizisi de geçirebilirsiniz:

$users = Db::table('users')->where([
    ['status', '=', '1'],
    ['subscribed', '<>', '1'],
])->get();

orWhere yöntemi ve where yöntemi aynı parametreleri alır:

$users = Db::table('users')
                    ->where('votes', '>', 100)
                    ->orWhere('name', 'John')
                    ->get();

orWhere yöntemine bir kapanış geçebilirsiniz:

// SQL: select * from users where votes > 100 or (name = 'Abigail' and votes > 50)
$users = Db::table('users')
            ->where('votes', '>', 100)
            ->orWhere(function($query) {
                $query->where('name', 'Abigail')
                      ->where('votes', '>', 50);
            })
            ->get();

whereBetween / orWhereBetween yöntemleri, alanın değerinin belirli iki değer arasında olup olmadığını kontrol eder:

$users = Db::table('users')
           ->whereBetween('votes', [1, 100])
           ->get();

whereNotBetween / orWhereNotBetween yöntemleri, alanın değerinin belirli iki değerin dışına çıkıp çıkmadığını kontrol eder:

$users = Db::table('users')
                    ->whereNotBetween('votes', [1, 100])
                    ->get();

whereIn / whereNotIn / orWhereIn / orWhereNotIn yöntemleri, alanın değerinin belirtilen dizi içinde olup olmadığını kontrol eder:

$users = Db::table('users')
                    ->whereIn('id', [1, 2, 3])
                    ->get();

whereNull / whereNotNull / orWhereNull / orWhereNotNull yöntemleri, belirtilen alanın NULL olmasını gerektirir:

$users = Db::table('users')
                    ->whereNull('updated_at')
                    ->get();

whereNotNull yöntemi, belirtilen alanın NULL olmaması gerektiğini kontrol eder:

$users = Db::table('users')
                    ->whereNotNull('updated_at')
                    ->get();

whereDate / whereMonth / whereDay / whereYear / whereTime yöntemleri, alan değerini belirlenen tarihlerle karşılaştırmak için kullanılır:

$users = Db::table('users')
                ->whereDate('created_at', '2016-12-31')
                ->get();

whereColumn / orWhereColumn yöntemleri, iki alanın değerinin eşit olup olmadığını kontrol eder:

$users = Db::table('users')
                ->whereColumn('first_name', 'last_name')
                ->get();

// Bir karşılaştırma operatörü de geçebilirsiniz
$users = Db::table('users')
                ->whereColumn('updated_at', '>', 'created_at')
                ->get();

// whereColumn yöntemi dizi de alabilir
$users = Db::table('users')
                ->whereColumn([
                    ['first_name', '=', 'last_name'],
                    ['updated_at', '>', 'created_at'],
                ])->get();

Parametre Gruplama

// select * from users where name = 'John' and (votes > 100 or title = 'Admin')
$users = Db::table('users')
           ->where('name', '=', 'John')
           ->where(function ($query) {
               $query->where('votes', '>', 100)
                     ->orWhere('title', '=', 'Admin');
           })
           ->get();

whereExists

// select * from users where exists ( select 1 from orders where orders.user_id = users.id )
$users = Db::table('users')
           ->whereExists(function ($query) {
               $query->select(Db::raw(1))
                     ->from('orders')
                     ->whereRaw('orders.user_id = users.id');
           })
           ->get();

orderBy

$users = Db::table('users')
                ->orderBy('name', 'desc')
                ->get();

Rastgele Sıralama

$randomUser = Db::table('users')
                ->inRandomOrder()
                ->first();

Rastgele sıralama, sunucu performansına büyük bir etki yapar, kullanılması önerilmez.

groupBy / having

$users = Db::table('users')
                ->groupBy('account_id')
                ->having('account_id', '>', 100)
                ->get();
// groupBy yöntemine birden fazla parametre geçebilirsiniz
$users = Db::table('users')
                ->groupBy('first_name', 'status')
                ->having('account_id', '>', 100)
                ->get();

offset / limit

$users = Db::table('users')
                ->offset(10)
                ->limit(5)
                ->get();

Ekleme

Tek bir kayıt ekleme

Db::table('users')->insert(
    ['email' => 'john@example.com', 'votes' => 0]
);

Birden fazla kayıt ekleme

Db::table('users')->insert([
    ['email' => 'taylor@example.com', 'votes' => 0],
    ['email' => 'dayle@example.com', 'votes' => 0]
]);

Otomatik Artan ID

$id = Db::table('users')->insertGetId(
    ['email' => 'john@example.com', 'votes' => 0]
);

Dikkat: PostgreSQL kullanırken, insertGetId yöntemi varsayılan olarak id alanını otomatik artan alan adı olarak alır. Farklı bir "dizi" den ID almak istiyorsanız, alan adını ikinci parametre olarak insertGetId yöntemine geçebilirsiniz.

Güncelleme

$affected = Db::table('users')
              ->where('id', 1)
              ->update(['votes' => 1]);

Güncelleme veya Ekleme

Bazen veritabanındaki mevcut kayıtları güncellemeyi, veya eşleşen kayıt yoksa yeni bir kayıt oluşturmayı isteyebilirsiniz:

Db::table('users')
    ->updateOrInsert(
        ['email' => 'john@example.com', 'name' => 'John'],
        ['votes' => '2']
    );

updateOrInsert yöntemi öncelikle birinci parametrenin anahtar-değer çiftlerini kullanarak eşleşen veritabanı kaydını bulmaya çalışır. Kayıt mevcutsa, ikinci parametredeki değerlerle günceller. Kayıt bulunamazsa, yeni bir kayıt ekler; yeni kaydın verileri iki dizinin birleşimidir.

Artırma & Azaltma

Bu iki yöntem en az bir parametre alır: değiştirilecek sütun. İkinci parametre isteğe bağlıdır ve sütunun artış veya azalış miktarını kontrol eder:

Db::table('users')->increment('votes');

Db::table('users')->increment('votes', 5);

Db::table('users')->decrement('votes');

Db::table('users')->decrement('votes', 5);

İşlem sırasında güncellenecek alanları da belirtebilirsiniz:

Db::table('users')->increment('votes', 1, ['name' => 'John']);

Silme

Db::table('users')->delete();

Db::table('users')->where('votes', '>', 100)->delete();

Tabloyu tamamen boşaltmanız gerekiyorsa, tüm satırları silecek ve otomatik artan ID'yi sıfırlayacak truncate yöntemini kullanabilirsiniz:

Db::table('users')->truncate();

İşlemler

Veritabanı İşlemleri esnasında bilgilere göz atın.

Kötü Zamanlama

Sorgu oluşturucusu, select sözdizimiyle "kötü zamanlama" uygulamanıza yardımcı olacak bazı işlevler içerir. Sorgunuzda "paylaşılan kilit" uygulamak istiyorsanız, sharedLock yöntemini kullanabilirsiniz. Paylaşılan kilit, seçilen veri sütunlarının değiştirilmesini engeller, ta ki işlem onaylanana kadar:

Db::table('users')->where('votes', '>', 100)->sharedLock()->get();

Alternatif olarak, lockForUpdate yöntemini kullanabilirsiniz. "güncelleme" kilidi, satırların diğer paylaşılan kilitlerle değiştirilmesini veya seçilmesini engeller:

Db::table('users')->where('votes', '>', 100)->lockForUpdate()->get();

Hata Ayıklama

Sorgu sonuçlarını veya SQL ifadelerini görüntülemek için dd veya dump yöntemlerini kullanabilirsiniz. dd yöntemi, hata ayıklama bilgilerini gösterir ve ardından isteğin yürütülmesini durdurur. dump yöntemi de hata ayıklama bilgilerini gösterir, ancak isteğin yürütülmesini durdurmaz:

Db::table('users')->where('votes', '>', 100)->dd();
Db::table('users')->where('votes', '>', 100)->dump();

Dikkat
Hata ayıklamak için symfony/var-dumper yüklenmelidir, komut için composer require symfony/var-dumper kullanın.