XOOPS Sorgu Oluşturucu
XOOPS Sorgu Oluşturucu, SQL sorguları oluşturmak için modern, akıcı bir arayüz sağlar. SQL enjeksiyonunun önlenmesine yardımcı olur, okunabilirliği artırır ve birden fazla database sistemi için database soyutlaması sağlar.
Sorgu Oluşturucu Mimarisi
Section titled “Sorgu Oluşturucu Mimarisi”graph TD A[QueryBuilder] -->|builds| B[SELECT Queries] A -->|builds| C[INSERT Queries] A -->|builds| D[UPDATE Queries] A -->|builds| E[DELETE Queries]
F[Table] -->|chains| G[select] F -->|chains| H[where] F -->|chains| I[orderBy] F -->|chains| J[limit]
G -->|chains| K[join] G -->|chains| H H -->|chains| I I -->|chains| J
L[Execute Methods] -->|returns| M[Results] L -->|returns| N[Count] L -->|returns| O[First/Last]QueryBuilder Sınıfı
Section titled “QueryBuilder Sınıfı”Akıcı arayüze sahip ana sorgu oluşturucu sınıfı.
Sınıfa Genel Bakış
Section titled “Sınıfa Genel Bakış”namespace Xoops\Database;
class QueryBuilder{ protected string $table = ''; protected string $type = 'SELECT'; protected array $selects = []; protected array $joins = []; protected array $wheres = []; protected array $orders = []; protected int $limit = 0; protected int $offset = 0; protected array $bindings = [];}Statik Yöntemler
Section titled “Statik Yöntemler”Bir tablo için yeni bir sorgu oluşturucu oluşturur.
public static function table(string $table): QueryBuilderParametreler:
| Parametre | Tür | Açıklama |
|---|---|---|
$table | dize | Tablo adı (önekli veya öneksiz) |
Döndürür: QueryBuilder - Sorgu oluşturucu örneği
Örnek:
$query = QueryBuilder::table('users');$query = QueryBuilder::table('xoops_users'); // With prefixSELECT Sorgular
Section titled “SELECT Sorgular”Seçilecek sütunları belirtir.
public function select(...$columns): selfParametreler:
| Parametre | Tür | Açıklama |
|---|---|---|
...$columns | dizi | Sütun adları veya ifadeleri |
Döndürür: self - Yöntem zincirleme için
Örnek:
// Simple selectQueryBuilder::table('users') ->select('id', 'username', 'email') ->get();
// Select with aliasesQueryBuilder::table('users') ->select('id as user_id', 'username as name') ->get();
// Select all columnsQueryBuilder::table('users') ->select('*') ->get();
// Select with expressionsQueryBuilder::table('orders') ->select('id', 'COUNT(*) as total_items') ->groupBy('id') ->get();nerede
Section titled “nerede”Bir WHERE koşulu ekler.
public function where(string $column, string $operator = '=', mixed $value = null): selfParametreler:
| Parametre | Tür | Açıklama |
|---|---|---|
$column | dize | Sütun adı |
$operator | dize | Karşılaştırma operatörü |
$value | karışık | Karşılaştırılacak değer |
Döndürür: self - Yöntem zincirleme için
Operatörler:
| Operatör | Açıklama | Örnek |
|---|---|---|
= | Eşit | ->where('status', '=', 'active') |
!= veya <> | Eşit değil | ->where('status', '!=', 'deleted') |
> | Şundan büyük: | ->where('price', '>', 100) |
< | ’dan az | |
>= | Büyük veya eşit | ->where('age', '>=', 18) |
<= | Daha az veya eşit | ->where('age', '<=', 65) |
LIKE | Desen uyumu | ->where('name', 'LIKE', '%john%') |
IN | Listede | ->where('status', 'IN', ['active', 'pending']) |
NOT IN | Listede yok | ->where('id', 'NOT IN', [1, 2, 3]) |
BETWEEN | Menzil | ->where('age', 'BETWEEN', [18, 65]) |
IS NULL | Boş | ->where('deleted_at', 'IS NULL') |
IS NOT NULL | Boş değil | ->where('deleted_at', 'IS NOT NULL') |
Örnek:
// Single conditionQueryBuilder::table('users') ->select('*') ->where('status', '=', 'active') ->get();
// Multiple conditions (AND)QueryBuilder::table('users') ->select('*') ->where('status', '=', 'active') ->where('age', '>=', 18) ->get();
// IN operatorQueryBuilder::table('products') ->select('*') ->where('category_id', 'IN', [1, 2, 3]) ->get();
// LIKE operatorQueryBuilder::table('users') ->select('*') ->where('email', 'LIKE', '%@example.com') ->get();
// NULL checkQueryBuilder::table('users') ->select('*') ->where('deleted_at', 'IS NULL') ->get();veyaNerede
Section titled “veyaNerede”VEYA koşulu ekler.
public function orWhere(string $column, string $operator = '=', mixed $value = null): selfÖrnek:
QueryBuilder::table('users') ->select('*') ->where('status', '=', 'active') ->orWhere('premium', '=', 1) ->get(); // SELECT * FROM users WHERE status = 'active' OR premium = 1neredeIn / neredeNotIn
Section titled “neredeIn / neredeNotIn”IN/NOT IN için uygun yöntemler.
public function whereIn(string $column, array $values): selfpublic function whereNotIn(string $column, array $values): selfÖrnek:
QueryBuilder::table('posts') ->select('*') ->whereIn('status', ['published', 'scheduled']) ->get();
QueryBuilder::table('comments') ->select('*') ->whereNotIn('spam_score', [8, 9, 10]) ->get();WhereNull / WhereNotNull
Section titled “WhereNull / WhereNotNull”NULL çekleri için uygun yöntemler.
public function whereNull(string $column): selfpublic function whereNotNull(string $column): selfÖrnek:
QueryBuilder::table('users') ->select('*') ->whereNotNull('verified_at') ->get();neredeArasında
Section titled “neredeArasında”Değerin iki değer arasında olup olmadığını kontrol eder.
public function whereBetween(string $column, array $values): selfÖrnek:
QueryBuilder::table('products') ->select('*') ->whereBetween('price', [10, 100]) ->get();
QueryBuilder::table('orders') ->select('*') ->whereBetween('created_at', ['2024-01-01', '2024-12-31']) ->get();Bir INNER JOIN ekler.
public function join( string $table, string $first, string $operator = '=', string $second = null): selfÖrnek:
QueryBuilder::table('posts') ->select('posts.*', 'users.username', 'categories.name') ->join('users', 'posts.user_id', '=', 'users.id') ->join('categories', 'posts.category_id', '=', 'categories.id') ->where('posts.published', '=', 1) ->get();leftKatıl / sağKatıl
Section titled “leftKatıl / sağKatıl”Alternatif birleştirme türleri.
public function leftJoin( string $table, string $first, string $operator = '=', string $second = null): self
public function rightJoin( string $table, string $first, string $operator = '=', string $second = null): selfÖrnek:
QueryBuilder::table('users') ->select('users.*', 'COUNT(posts.id) as post_count') ->leftJoin('posts', 'users.id', '=', 'posts.user_id') ->groupBy('users.id') ->get();groupBy
Section titled “groupBy”Sonuçları sütunlara göre gruplandırır.
public function groupBy(...$columns): selfÖrnek:
QueryBuilder::table('orders') ->select('user_id', 'COUNT(*) as order_count', 'SUM(total) as total_spent') ->groupBy('user_id') ->get();
QueryBuilder::table('sales') ->select('department', 'region', 'SUM(amount) as total') ->groupBy('department', 'region') ->get();sahip olmak
Section titled “sahip olmak”Bir HAVING koşulu ekler.
public function having(string $column, string $operator = '=', mixed $value = null): selfÖrnek:
QueryBuilder::table('orders') ->select('user_id', 'COUNT(*) as order_count') ->groupBy('user_id') ->having('order_count', '>', 5) ->get();orderBy
Section titled “orderBy”Sonuçları sipariş eder.
public function orderBy(string $column, string $direction = 'ASC'): selfParametreler:
| Parametre | Tür | Açıklama |
|---|---|---|
$column | dize | Sütun sipariş etme ölçütü |
$direction | dize | ASC veya DESC |
Örnek:
// Single orderQueryBuilder::table('users') ->select('*') ->orderBy('created_at', 'DESC') ->get();
// Multiple ordersQueryBuilder::table('posts') ->select('*') ->orderBy('category_id', 'ASC') ->orderBy('created_at', 'DESC') ->get();
// Random orderQueryBuilder::table('quotes') ->select('*') ->orderBy('RAND()') ->get();limit / ofset
Section titled “limit / ofset”Sonuçları sınırlar ve dengeler.
public function limit(int $limit): selfpublic function offset(int $offset): selfÖrnek:
// Simple limitQueryBuilder::table('posts') ->select('*') ->limit(10) ->get();
// Pagination$page = 2;$perPage = 20;$offset = ($page - 1) * $perPage;
QueryBuilder::table('posts') ->select('*') ->limit($perPage) ->offset($offset) ->get();Yürütme Yöntemleri
Section titled “Yürütme Yöntemleri”Sorguyu yürütür ve tüm sonuçları döndürür.
public function get(): arrayDöndürür: array - Sonuç satırlarının dizisi
Örnek:
$users = QueryBuilder::table('users') ->select('id', 'username', 'email') ->where('status', '=', 'active') ->orderBy('username') ->get();
foreach ($users as $user) { echo $user['username'] . ' (' . $user['email'] . ')' . "\n";}İlk sonucu alır.
public function first(): ?arrayDöndürür: ?array - İlk satır veya boş
Örnek:
$user = QueryBuilder::table('users') ->select('*') ->where('id', '=', 123) ->first();
if ($user) { echo 'Found: ' . $user['username'];}Son sonucu alır.
public function last(): ?arrayÖrnek:
$latestPost = QueryBuilder::table('posts') ->select('*') ->orderBy('created_at', 'DESC') ->last();sayısı
Section titled “sayısı”Sonuçların sayısını alır.
public function count(): intDöndürür: int - Satır sayısı
Örnek:
$activeUsers = QueryBuilder::table('users') ->where('status', '=', 'active') ->count();
echo "Active users: $activeUsers";mevcut
Section titled “mevcut”Sorgunun herhangi bir sonuç döndürüp döndürmediğini kontrol eder.
public function exists(): boolDöndürür: bool - Sonuçlar mevcutsa doğru
Örnek:
if (QueryBuilder::table('users')->where('email', '=', 'test@example.com')->exists()) { echo 'User already exists';}toplam
Section titled “toplam”Toplam değerleri alır.
public function aggregate(string $function, string $column): mixedÖrnek:
$maxPrice = QueryBuilder::table('products') ->aggregate('MAX', 'price');
$avgAge = QueryBuilder::table('users') ->aggregate('AVG', 'age');
$totalSales = QueryBuilder::table('orders') ->aggregate('SUM', 'total');INSERT Sorgular
Section titled “INSERT Sorgular”Bir satır ekler.
public function insert(array $values): boolÖrnek:
QueryBuilder::table('users')->insert([ 'username' => 'john', 'email' => 'john@example.com', 'password' => password_hash('secret', PASSWORD_BCRYPT), 'created_at' => date('Y-m-d H:i:s')]);insertMany
Section titled “insertMany”Birden çok satır ekler.
public function insertMany(array $rows): boolÖrnek:
QueryBuilder::table('log_entries')->insertMany([ ['action' => 'login', 'user_id' => 1, 'timestamp' => time()], ['action' => 'logout', 'user_id' => 2, 'timestamp' => time()], ['action' => 'update', 'user_id' => 3, 'timestamp' => time()]]);UPDATE Sorgular
Section titled “UPDATE Sorgular”güncelleme
Section titled “güncelleme”Satırları günceller.
public function update(array $values): intDöndürür: int - Etkilenen satır sayısı
Örnek:
// Update single userQueryBuilder::table('users') ->where('id', '=', 123) ->update([ 'email' => 'newemail@example.com', 'updated_at' => date('Y-m-d H:i:s') ]);
// Update multiple rowsQueryBuilder::table('posts') ->where('status', '=', 'draft') ->where('created_at', '<', date('Y-m-d', strtotime('-30 days'))) ->update([ 'status' => 'archived' ]);artırma / azaltma
Section titled “artırma / azaltma”Bir sütunu artırır veya azaltır.
public function increment(string $column, int $amount = 1): intpublic function decrement(string $column, int $amount = 1): intÖrnek:
// Increment view countQueryBuilder::table('posts') ->where('id', '=', 123) ->increment('views');
// Decrement stockQueryBuilder::table('products') ->where('id', '=', 456) ->decrement('stock', 5);DELETE Sorgular
Section titled “DELETE Sorgular”Satırları siler.
public function delete(): intDöndürür: int - Silinen satırların sayısı
Örnek:
// Delete single recordQueryBuilder::table('comments') ->where('id', '=', 789) ->delete();
// Delete multiple recordsQueryBuilder::table('log_entries') ->where('created_at', '<', date('Y-m-d', strtotime('-30 days'))) ->delete();kısalt
Section titled “kısalt”Tablodaki tüm satırları siler.
public function truncate(): boolÖrnek:
// Clear all sessionsQueryBuilder::table('sessions')->truncate();Gelişmiş Özellikler
Section titled “Gelişmiş Özellikler”Ham İfadeler
Section titled “Ham İfadeler”QueryBuilder::table('products') ->select('id', 'name', QueryBuilder::raw('price * quantity as total')) ->get();Alt sorgular
Section titled “Alt sorgular”$recentPostIds = QueryBuilder::table('posts') ->select('id') ->where('created_at', '>', date('Y-m-d', strtotime('-7 days'))) ->toSql();
$comments = QueryBuilder::table('comments') ->select('*') ->whereIn('post_id', $recentPostIds) ->get();SQL’yi alma
Section titled “SQL’yi alma”public function toSql(): stringÖrnek:
$sql = QueryBuilder::table('users') ->select('id', 'username') ->where('status', '=', 'active') ->toSql();
echo $sql;// SELECT id, username FROM xoops_users WHERE status = ?Tam Örnekler
Section titled “Tam Örnekler”Birleşimlerle Karmaşık Seçim
Section titled “Birleşimlerle Karmaşık Seçim”<?php/** * Get posts with author and category info */
$posts = QueryBuilder::table('posts') ->select( 'posts.id', 'posts.title', 'posts.content', 'posts.created_at', 'users.username as author', 'categories.name as category' ) ->join('users', 'posts.user_id', '=', 'users.id') ->join('categories', 'posts.category_id', '=', 'categories.id') ->where('posts.published', '=', 1) ->orderBy('posts.created_at', 'DESC') ->limit(10) ->get();
foreach ($posts as $post) { echo '<article>'; echo '<h2>' . htmlspecialchars($post['title']) . '</h2>'; echo '<p class="meta">By ' . htmlspecialchars($post['author']) . ' in ' . htmlspecialchars($post['category']) . '</p>'; echo '<p>' . htmlspecialchars($post['content']) . '</p>'; echo '</article>';}QueryBuilder ile sayfalandırma
Section titled “QueryBuilder ile sayfalandırma”<?php/** * Paginated results */
$page = isset($_GET['page']) ? (int)$_GET['page'] : 1;$perPage = 20;$offset = ($page - 1) * $perPage;
// Get total count$total = QueryBuilder::table('articles') ->where('status', '=', 'published') ->count();
// Get page results$articles = QueryBuilder::table('articles') ->select('*') ->where('status', '=', 'published') ->orderBy('created_at', 'DESC') ->limit($perPage) ->offset($offset) ->get();
// Calculate pagination$pages = ceil($total / $perPage);
// Display resultsforeach ($articles as $article) { echo '<div class="article">' . htmlspecialchars($article['title']) . '</div>';}
// Display pagination linksif ($pages > 1) { echo '<nav class="pagination">'; for ($i = 1; $i <= $pages; $i++) { if ($i == $page) { echo '<span class="current">' . $i . '</span>'; } else { echo '<a href="?page=' . $i . '">' . $i . '</a>'; } } echo '</nav>';}Toplamalarla Veri Analizi
Section titled “Toplamalarla Veri Analizi”<?php/** * Sales analysis */
// Total sales by region$regionSales = QueryBuilder::table('orders') ->select('region', QueryBuilder::raw('SUM(total) as total_sales'), QueryBuilder::raw('COUNT(*) as order_count')) ->groupBy('region') ->orderBy('total_sales', 'DESC') ->get();
foreach ($regionSales as $region) { echo $region['region'] . ': $' . number_format($region['total_sales'], 2) . ' (' . $region['order_count'] . ' orders)' . "\n";}
// Average order value$avgOrderValue = QueryBuilder::table('orders') ->aggregate('AVG', 'total');
echo 'Average order value: $' . number_format($avgOrderValue, 2);En İyi Uygulamalar
Section titled “En İyi Uygulamalar”- Parametreli Sorguları Kullan - QueryBuilder parametre bağlamayı otomatik olarak yönetir
- Zincir Yöntemleri - Okunabilir kod için akıcı arayüzden yararlanın
- Test SQL Çıktısı - Oluşturulan sorguları doğrulamak için
toSql()’yi kullanın - Dizinleri Kullan - Sık sorgulanan sütunların dizine eklendiğinden emin olun
- Sonuçları Sınırla - Büyük veri kümeleri için her zaman
limit()kullanın - Toplamları Kullan - Veritabanının PHP yerine counting/summing yapmasını sağlayın
- Çıktıdan Kaçış - Görüntülenen verilerden her zaman
htmlspecialchars()ile çıkın - Dizin Performansı - Yavaş sorguları izleyin ve buna göre optimize edin
İlgili Belgeler
Section titled “İlgili Belgeler”- XoopsDatabase - database katmanı ve bağlantıları
- Kriterler - Eski Kriterlere dayalı sorgulama sistemi
- ../Core/XoopsObject - Veri nesnesi kalıcılığı
- ../Module/Module-System - module database işlemleri
Ayrıca bakınız: XOOPS database API