Skip to content

Latest commit

 

History

History
875 lines (618 loc) · 17.7 KB

README.md

File metadata and controls

875 lines (618 loc) · 17.7 KB

⛓️ PDB

PHP için PDO query-builder

Kurulum

🛠️ Paketi composer ile projenize dahil edin;

composer require proff56/pdb

Örnek Kullanım

use Mlevent\Pdb;

/**
 * MYSQL
 */
$db = new Pdb([
    'database' => 'ecommerce',
    'username' => 'root',
    'password' => 'test'
]);

/**
 * SQLITE
 */
$db = new Pdb([
    'driver'   => 'sqlite',
    'database' => 'ecommerce.sqlite'
]);

Composer Kullanmadan

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'
]);

Yapılandırma

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)

Fetch

Kullanılabilecek metodlar: get(), first(), value(), pluck(), find()

Get

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

toArray()

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'];
}

toJson()

Sonuçlara Json formatında ulaşmak için kullanılır.

$products = $db->table('products')
               ->toJson()
               ->get();

First

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;

Value

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;

Pluck

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
)

Find

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')

Total

Toplam satır sayısına ulaşmak için kullanılır.

$total = $db->table('users')
            ->where('userGroup', 'Admin')
            ->total();
  • total()
  • total('users')

rowCount()

Etkilenen satır sayısı veya okunan satır sayısına ulaşmak için kullanılır.

echo $db->rowCount();

lastInsertId()

Insert işlemlerinde kaydedilen son satırın birincil anahtarını döndürür.

echo $db->lastInsertId();

Raw Query

Salt sql sorgusu çalıştırmak için kullanılır.

Raw Fecth

$results = $db->raw('SELECT * FROM products WHERE active = ? AND MONTH(created) = MONTH(NOW())', 1)
              ->get();

Raw Exec

$update = $db->raw('UPDATE payments SET active = !active WHERE status = ?', ['paid'])
             ->exec();

Pager

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');

pagerLinks()

Linklerin çıktısını almak için kullanılır.

echo $db->pagerLinks();
  • « 1 2 3 4 5 6 ... »

pagerData()

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
)

setPagerTemplate()

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>');

Cache

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.

Disk Cache

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.

Redis Cache

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.


Insert

Tabloya yeni bir satır eklemek için kullanılır. insert() metoduyla tek veya birden fazla kayıt eklenebilir.

Tekli Kayıt

$db->table('products')->insert([
    'name'  => 'Apple Iphone X 128 Gb',
    'code'  => 'APPLEX128',
    'price' => '999.9'
]);

Çoklu Kayıt

$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.

Upsert

$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.

Insert Ignore

$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.

Insert Replace

$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.


Update

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.

Touch

active sütunu 1 ise 0, 0 ise 1 değerini alır.

$touch = $db->table('products')
            ->touch('active');
  • touch('active', 'products')

Increment

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)

Decrement

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)

Delete

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.

Filter

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 email 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'    => '[email protected]',
    '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.

Validate

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'    => '[email protected]',
        '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.

Transaction

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();
}

Select

$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.

Select Functions

Metodlar: count(), sum(), avg(), min(), max()

$db->sum('amount')...
  • sum('amount')
  • sum('amount', 'totalAmount')

Table

table() ve from() metodu aynı işlevi görür.

$db->table('products')...
  • table('products')
  • table(['products as p', 'images as i'])

Join

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')

joinNode()

İ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] => [email protected]
    [cartData] => Array
        (
            [0] => stdClass Object
                (
                    [name] => Apple Iphone X 128 GB
                    [quantity] => 1
                )

            [1] => stdClass Object
                (
                    [name] => Apple Iphone X 256 GB
                    [quantity] => 1
                )

        )
)

Where

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())')

Group Where

$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(?,?,?))

Between

Metodlar: between(), orBetween(), notBetween(), orNotBetween()

$db->between('price', 50, 250)...

Is Null - Not Null

Metodlar: isNull(), orIsNull(), notNull(), orNotNull()

$db->isNull('code')...
  • isNull('slug')
  • isNull(['slug', ...])

In - Not In

Metodlar: in(), orIn(), notIn(), orNotIn()

$db->in('id', [33922, 31221, 45344, 35444])...

Find In Set

Metodlar: findInSet(), orFindInSet(), notFindInSet(), orNotFindInSet()

$db->findInSet('categoryId', 139)...

Like - Not Like

Metodlar: like(), orLike(), notLike(), orNotlike()

$db->like('name', '%Apple%')...
  • like('name')
  • like(['name', ...])

Order

Varsayılan olarak desc seçilir.

$db->order('id')...
  • order('id')
  • order('id', 'asc')
  • order('id desc, name asc')
  • order('rand()')

Group

$db->group('id')...
  • group('id')
  • group(['id', 'name'])

Having

$db->having('stock', 5)...
  • having('stock', 5)
  • having('stock > 5')
  • having('stock > ?', 5)

Limit - Offset

Limit, Offset ve Sayfalama işlemleri için kullanılır.

$db->limit(100)...
$db->limit(100, 0)...
$db->limit(100)->offset(0)...

History

queryHistory()

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
        )
)

lastQuery()

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

lastParams()

Son sorguyu ait parametreleri görmek için kullanılır.

var_dump($db->lastParams());
Array
(
    [0] => 34066,
    [1] => 1
)

queryCount()

Toplam sorgu sayısına ulaşmak için kullanılır.

echo $db->queryCount();
  • 1

Structure

Yapısal sorgular için kullanılır.

$db->repair('sessions');

Metodlar: truncate(), drop(), optimize(), analyze(), check(), checksum(), repair()

Contributors