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:
- Mysql
- Sqlite (test aşamasında)
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.
- Henüz Sqlite desteği yok.
$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]);
- Etkilenen satır sayısı döner.
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');
- Etkilenen satır sayısı döner.
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 tablosundafullname
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ındaElephant
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 desc
Son 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();
1
Yapısal sorgular için kullanılır.
$db->repair('sessions');
Metodlar: truncate()
, drop()
, optimize()
, analyze()
, check()
, checksum()
, repair()
- mlevent Mert Levent