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çinsymfony/var-dumper
yüklenmelidir, komut içincomposer require symfony/var-dumper
kullanın.