PHP için PDO query-builder
🛠️ Paketi composer ile projenize dahil edin;
composer require mlevent/pdb
use Mlevent\Pdb;
/**
* MYSQL
*/
$db = new Pdb([
'database' => 'ecommerce',
'username' => 'root',
'password' => 'test'
]);
/**
* SQLITE
*/
$db = new Pdb([
'driver' => 'sqlite',
'database' => 'ecommerce.sqlite'
]);
Yeni bir dizin oluşturarak src klasörü altındaki tüm dosyaları içine kopyalayın ve autoload.php dosyasını require ile sayfaya dahil ederek sınıfı başlatın.
require '{pdb_dosyalarinin_bulundugu_dizin}/autoload.php';
use Mlevent\Pdb;
$db = new Pdb([
'database' => 'ecommerce',
'username' => 'root',
'password' => 'test'
]);
Varsayılan yapılandırma ayarları:
[
'host' => 'localhost',
'driver' => 'mysql',
'database' => '',
'username' => 'root',
'password' => '',
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'debug' => false,
'cacheTime' => 60,
'cachePath' => __DIR__ . '/Cache'
]
Şu anda kullanılabilir durumda olan driver listesi:
Kullanılabilecek metodlar: get(), first(), value(), pluck(), find()
Bu yöntem varsayılan olarak bir stdClass nesnesi döndürür. Sonuçlara Array formatında ulaşmak isterseniz toArray() metoduna göz atın.
$products = $db->get('products');
foreach ($products as $product) {
echo $product->name;
}
get()get('products')Bir SQL sorgusu oluşturup, bu sorguyu çalıştırmak için metodları zincir şeklinde kullanabilirsiniz.
$query = $db->select('id, name, code, price, stock')
->table('products')
->between('price', 900, 1500)
->grouped( function($q) {
$q->like(['code', 'name'], '%iphone%')
->orWhere('featured', 1);
})
->in('categoryId', [1, 2, 3, 4, 5, 6])
->order('price')
->get();
Yukarıdaki zincirin sorgu çıktısı şu şekilde olacaktır:
SELECT
id, name, code, price, stock
FROM
products
WHERE
price BETWEEN ? AND ?
AND ((name LIKE ? OR code LIKE ?) OR featured=?)
AND categoryId IN(?,?,?,?,?,?)
ORDER BY
price DESC
Sonuçlara Array formatında ulaşmak için kullanılır.
$products = $db->table('products')
->toArray()
->get();
foreach ($products as $product) {
echo $product['name'];
}
Sonuçlara Json formatında ulaşmak için kullanılır.
$products = $db->table('products')
->toJson()
->get();
Bir tablodan sadece tek bir satır almanız gerekiyorsa, first() yöntemini kullanabilirsiniz. Bu yöntem, varsayılan olarak tek bir stdClass nesnesi döndürür.
$user = $db->table('users')
->first();
echo $user->email;
Bir satırın tamamına ihtiyacınız yoksa, value yöntemini kullanarak bir kayıttan tek bir değer çıkarabilirsiniz.
$email = $db->table('users')
->where('name', 'Walter')
->value('email');
echo $email;
Tek bir sütunun değerlerini içeren bir dizi istiyorsanız pluck() yöntemini kullanabilirsiniz.
$pluck = $db->table('products')
->pluck('name');
Array
(
[0] => Apple Iphone X 128 GB
[1] => Apple Iphone X 256 GB
[2] => Apple Iphone X 512 GB
)
pluck() metoduna ikinci bir parametre göndererek, elde edilen dizinin anahtarları olarak kullanılmasını istediğiniz sütunu belirtebilirsiniz:
$pluck = $db->table('products')
->pluck('name', 'code');
Array
(
[APPLEX128] => Apple Iphone X 128 GB
[APPLEX256] => Apple Iphone X 256 GB
[APPLEX512] => Apple Iphone X 512 GB
)
Birincil anahtarla eşleşen kaydı döndürür.
$user = $db->table('users')
->find(15);
echo $user->name;
SELECT * FROM users WHERE id=?
find(15)find(15, 'products')Toplam satır sayısına ulaşmak için kullanılır.
$total = $db->table('users')
->where('userGroup', 'Admin')
->total();
total()total('users')Etkilenen satır sayısı veya okunan satır sayısına ulaşmak için kullanılır.
echo $db->rowCount();
Insert işlemlerinde kaydedilen son satırın birincil anahtarını döndürür.
echo $db->lastInsertId();
Salt sql sorgusu çalıştırmak için kullanılır.
$results = $db->raw('SELECT * FROM products WHERE active = ? AND MONTH(created) = MONTH(NOW())', 1)
->get();
$update = $db->raw('UPDATE payments SET active = !active WHERE status = ?', ['paid'])
->exec();
Parametre olarak sayfa başına listelenecek kayıt sayısı gönderilmelidir. pager() metodu salt sorgularda çalışmaz.
$posts = $db->table('posts')
->pager(25)
->get();
foreach ($posts as $post) {
echo $post->title;
}
echo $db->pagerLinks();
pager() fonksiyonu 2 parametre alır. İlk parametre sayfa başına listelenecek kayıt sayısı, İkinci parametre sayfa bilgisinin aktarılacağı $_GET parametresidir. Örneğin link yapısı ?page=3 şeklinde kurgulanacaksa, örnek kullanım şu şekilde olmalıdır;
$db->pager(25, 'page');
Linklerin çıktısını almak için kullanılır.
echo $db->pagerLinks();
« ‹ 1 2 3 4 5 6 ... › »Toplam sonuç, sayfa sayısı, limit, ofset ve aktif sayfa gibi bilgilere ulaşmak için kullanılır.
var_dump($db->pagerData());
Array
(
[count] => 255
[limit] => 10
[offset] => 0
[total] => 26
[current] => 1
)
Link çıktısına ait HTML şablonu düzenlemek için kullanılır.
$db->setPagerTemplate('<li>
<a class="{active}" href="{url}">
{text}
</a>
</li>');
Sonuçları önbelleğe almak için kullanılır. Çok sık değişmesi gerekmeyen ve yoğun kullanımda performans sorunu oluşturabilecek sorgular için kullanılabilir.
comments tablosundaki verileri mysql’den okur ve diske kaydeder. Sonuçlar 30 saniye boyunca diskten okunur.
$results = $db->cache(30)->get('comments');
fromDisk() metodu; son sorgu diskten okunuyorsa true, mysql’den okunuyorsa false döner.
comments tablosundaki verileri mysql’den okur ve redis veritabanına kayder. Sonuçlar 30 saniye boyunca Redis üzerinden okunur.
$results = $db->redis(30)->get('comments');
fromRedis() metodu; son sorgu Redisten okunuyorsa true, mysql’den okunuyorsa false döner.
$redisConnect = (function(){
$redis = new \Redis();
$redis->connect('127.0.0.1', 6379, 1, NULL, 0, 0, ['auth' => ['default', '']]);
return $redis;
});
$db->setRedis($redisConnect());
setRedis() metodu ile Redis sınıfı dışarıdan dahil edilebilir.
Not: Redis ile önbellekleme işlemi yapabilmek için sunucunuzda Redis yüklü olması gerekir.
Tabloya yeni bir satır eklemek için kullanılır. insert() metoduyla tek veya birden fazla kayıt eklenebilir.
$db->table('products')->insert([
'name' => 'Apple Iphone X 128 Gb',
'code' => 'APPLEX128',
'price' => '999.9'
]);
$db->table('products')->insert([
['name' => 'Apple Iphone X 128 Gb', 'code' => 'APPLEX128', 'price' => '999.9'],
['name' => 'Apple Iphone X 256 Gb', 'code' => 'APPLEX256', 'price' => '1149.9'],
['name' => 'Apple Iphone X 512 Gb', 'code' => 'APPLEX512', 'price' => '1349.9']
]);
Son kaydedilen satırın birincil anahtarına ulaşmak için lastInsertId() metodunu, toplam etkilenen satır sayısı için rowCount() metodunu kullanabilirsiniz.
$db->table('products')->upsert([
'name' => 'Apple Iphone X 128 Gb',
'code' => 'APPLEX128',
'price' => '999.9'
]);
Benzersiz anahtarlara eşleşen veri bulunursa var olan kayıt güncellenir, yoksa yeni kayıt eklenir.
$db->table('products')->insertIgnore([
'name' => 'Apple Iphone X 128 Gb',
'code' => 'APPLEX128',
'price' => '999.9'
]);
Benzersiz anahtarlara eşleşen veri bulunursa kayıt eklenmez, yoksa yeni kayıt eklenir.
$db->table('products')->insertReplace([
'name' => 'Apple Iphone X 128 Gb',
'code' => 'APPLEX128',
'price' => '999.9'
]);
Benzersiz anahtarlara eşleşen veri bulunursa var olan kayıt silinir ve yeni kayıt eklenir, yoksa yeni kayıt eklenir. Her replace işleminde auto_increment olarak tanımlanan birincil anahtara (Genellikle ID) ait değer değişir. Değerin korunmasını istiyorsanız upsert() metodunu kullanmanız önerilir.
Bir veya birden fazla kaydı güncellemek için kullanılır.
$update = $db->table('products')
->where('id', 11255)
->update(['active' => 1]);
active sütunu 1 ise 0, 0 ise 1 değerini alır.
$touch = $db->table('products')
->touch('active');
touch('active', 'products')hit sütunu 1 veya gönderilen değer kadar artar.
$increment = $db->table('posts')
->where('slug', 'whats-new-in-laravel-8')
->increment('hit');
increment('hit')increment('hit', 5)hit sütunu 1 veya gönderilen değer kadar azalır.
$increment = $db->table('posts')
->where('slug', 'whats-new-in-laravel-8')
->decrement('hit');
decrement('hit')decrement('hit', 5)Bir veya birden fazla kaydı silmek için kullanılır.
$delete = $db->in('id', [321, 412, 324, 142])
->delete('products');
Gönderilen veriyi tablodaki sütunlarla karşılaştırır ve yanlış/fazla veriyi otomatik olarak temizler. insert(), insertIgnore(), insertReplace(), upsert(), update() metodlarıyla birlikte kullanılabilir.
| Primary | Not Null | Not Null | Not Null | enum(‘Male’, ‘Female’) |
|---|---|---|---|---|
| id | name | password | gender |
users adında bir tablomuz olduğunu ve yukarıdaki sütunlardan oluştuğunu varsayalım.
$db->table('users')->filter()->insert([
'username' => 'walterbishop',
'email' => 'walter@bishop.com',
'password' => 'U7!hsjlIus',
'gender' => 'Male',
'fullname' => 'Walter Bishop'
]);
filter() metodu users tablosunda fullname sütununu bulamadığı için bu veriyi otomatik temizleyip hatasız bir şekilde kayıt oluşturulmasını sağlar.$db->table('users')->filter()->insert($_POST);
$_POST ile gönderilen formlar için örnek bir kullanım şekli.Bu metot şu an için yalnızca; gönderilen veriyi filtreler, boş gönderilen alanları varsayılan değerleriyle doldurur, not null ve enum kontrolleri yapar.
try{
$db->table('users')->validate()->insert([
'username' => 'walterbishop',
'email' => 'walter@bishop.com',
'password' => 'U7!hsjlIus',
'gender' => 'Elephant'
]);
} catch(Exception $e){
echo $e->getMessage();
}
gender sütununda tanımlı enum değerleri arasında Elephant olmadığı için hata döner ve kayıt eklenmez.Metodlar: inTransaction(), beginTransaction(), commit(), rollBack()
try {
$db->beginTransaction();
$db->table('products')->insert([
'name' => 'Apple Iphone X 128 Gb',
'code' => 'APPLEX128',
'price' => '999.9'
]);
$db->table('images')->insert([
'productId' => $db->lastInsertId(),
'imageName' => 'foo.jpg'
]);
$db->commit();
} catch(Exception $e) {
$db->rollBack();
}
$db->select('id, name, code, price')...
select('id, name')select(['id', 'name', ...])Metod kullanılmazsa varsayılan olarak
*ile tüm sütunlar seçilir.
Metodlar: count(), sum(), avg(), min(), max()
$db->sum('amount')...
sum('amount')sum('amount', 'totalAmount')table() ve from() metodu aynı işlevi görür.
$db->table('products')...
table('products')table(['products as p', 'images as i'])Metodlar: leftJoin(), rightJoin(), innerJoin(), leftOuterJoin(), rightOuterJoin(), fullOuterJoin()
$db->table('products as p')
->leftJoin('images as i', 'p.id', 'i.productId')
->get();
leftJoin('images', 'products.id', 'images.productId')leftJoin('images', 'products.id = images.productId')leftJoin('images ON products.id = images.productId')İlişki kurulan tabloyla sonuç içerisinde yeni bir child element oluşturmak için joinNode() yöntemini kullanabilirsiniz.
$basketData = $db->table('users AS u')
->select('u.*')
->leftJoin('cart AS c', 'c.userId', 'u.id')
->joinNode('cartData', ['name' => 'c.productName', 'quantity' => 'c.quantity'])
->group('u.id')
->first();
stdClass Object
(
[id] => 159
[fullName] => John Doe
[email] => john@doe.com
[cartData] => Array
(
[0] => stdClass Object
(
[name] => Apple Iphone X 128 GB
[quantity] => 1
)
[1] => stdClass Object
(
[name] => Apple Iphone X 256 GB
[quantity] => 1
)
)
)
Metodlar: where(), orWhere(), notWhere(), orNotWhere()
$db->where('id', 32886)...
where('active', 1)where('stock >= ? AND active = ?', [2, 1])where(['stock > ?', 'active > ?'], [2, 1])where(['stock' => 2, 'active' => 1])where('stock >= 2 AND active = 1 AND MONTH(updated) = MONTH(NOW())')$db->table('products')
->like('name', '%iphone%')
->grouped(function($q){
$q->in('brandId', [1, 2, 3])->orIn('categoryId', [1, 2, 3]);
})->get();
SELECT * FROM products WHERE name LIKE ? AND (brandId IN(?,?,?) OR categoryId IN(?,?,?))Metodlar: between(), orBetween(), notBetween(), orNotBetween()
$db->between('price', 50, 250)...
Metodlar: isNull(), orIsNull(), notNull(), orNotNull()
$db->isNull('code')...
isNull('slug')isNull(['slug', ...])Metodlar: in(), orIn(), notIn(), orNotIn()
$db->in('id', [33922, 31221, 45344, 35444])...
Metodlar: findInSet(), orFindInSet(), notFindInSet(), orNotFindInSet()
$db->findInSet('categoryId', 139)...
Metodlar: like(), orLike(), notLike(), orNotlike()
$db->like('name', '%Apple%')...
like('name')like(['name', ...])Varsayılan olarak desc seçilir.
$db->order('id')...
order('id')order('id', 'asc')order('id desc, name asc')order('rand()')$db->group('id')...
group('id')group(['id', 'name'])$db->having('stock', 5)...
having('stock', 5)having('stock > 5')having('stock > ?', 5)Limit, Offset ve Sayfalama işlemleri için kullanılır.
$db->limit(100)...
$db->limit(100, 0)...
$db->limit(100)->offset(0)...
Sorgu listesine ulaşmak için kullanılır.
var_dump($db->queryHistory());
Array
(
[0] => Array
(
[query] => SELECT id, name FROM products WHERE code = ? AND active = ? ORDER BY id desc
[params] => Array
(
[0] => 34066
[1] => 1
)
[from] => redis
)
)
Son sorguyu görüntülemek için kullanılır.
echo $db->lastQuery();
SELECT id, name FROM products WHERE code = ? AND active = ? ORDER BY id descSon sorguyu ait parametreleri görmek için kullanılır.
var_dump($db->lastParams());
Array
(
[0] => 34066,
[1] => 1
)
Toplam sorgu sayısına ulaşmak için kullanılır.
echo $db->queryCount();
1Yapısal sorgular için kullanılır.
$db->repair('sessions');
Metodlar: truncate(), drop(), optimize(), analyze(), check(), checksum(), repair()