XOOPS Εργαλείο δημιουργίας ερωτημάτων
Το XOOPS Εργαλείο δόμησης ερωτημάτων παρέχει μια σύγχρονη, ευχάριστη διεπαφή για τη δημιουργία ερωτημάτων SQL. Βοηθά στην αποτροπή της έγχυσης SQL, βελτιώνει την αναγνωσιμότητα και παρέχει αφαίρεση βάσης δεδομένων για πολλαπλά συστήματα βάσεων δεδομένων.
Query Builder Architecture
Ενότητα με τίτλο «Query Builder Architecture»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
Ενότητα με τίτλο «Τάξη QueryBuilder»Η κύρια κλάση του προγράμματος δημιουργίας ερωτημάτων με άπταιστη διεπαφή.
# Επισκόπηση τάξης
Ενότητα με τίτλο «# Επισκόπηση τάξης»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 = [];}# Στατικές μέθοδοι
Ενότητα με τίτλο «# Στατικές μέθοδοι»# πίνακας
Ενότητα με τίτλο «# πίνακας»Δημιουργεί ένα νέο εργαλείο δημιουργίας ερωτημάτων για έναν πίνακα.
public static function table(string $table): QueryBuilderΠαράμετροι:
| Παράμετρος | Τύπος | Περιγραφή |
|---|---|---|
$table | χορδή | Όνομα πίνακα (με ή χωρίς πρόθεμα) |
Επιστροφές: QueryBuilder - Παράδειγμα δημιουργίας ερωτημάτων
Παράδειγμα:
$query = QueryBuilder::table('users');$query = QueryBuilder::table('xoops_users'); // With prefixSELECT Ερωτήματα
Ενότητα με τίτλο «SELECT Ερωτήματα»# επιλέξτε
Ενότητα με τίτλο «# επιλέξτε»Καθορίζει στήλες προς επιλογή.
public function select(...$columns): selfΠαράμετροι:
| Παράμετρος | Τύπος | Περιγραφή |
|---|---|---|
...$columns | συστοιχία | Ονόματα ή εκφράσεις στηλών |
Επιστροφές: self - Για αλυσιδοποίηση μεθόδων
Παράδειγμα:
// 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();Προσθέτει μια συνθήκη WHERE.
public function where(string $column, string $operator = '=', mixed $value = null): selfΠαράμετροι:
| Παράμετρος | Τύπος | Περιγραφή |
|---|---|---|
$column | χορδή | Όνομα στήλης |
$operator | χορδή | Σύγκριση χειριστή |
$value | μικτή | Αξία προς σύγκριση |
Επιστροφές: self - Για αλυσιδοποίηση μεθόδων
** Χειριστές: **
| Χειριστής | Περιγραφή | Παράδειγμα |
|---|---|---|
= | Ίσο | ->where('status', '=', 'active') |
!= ή <> | Όχι ίσο | ->where('status', '!=', 'deleted') |
> | Μεγαλύτερο από | ->where('price', '>', 100) |
< | Λιγότερο από | ->where('price', '<', 100) |
>= | Μεγαλύτερο ή ίσο | ->where('age', '>=', 18) |
<= | Λιγότερο ή ίσο | ->where('age', '<=', 65) |
LIKE | Ταίριασμα μοτίβου | ->where('name', 'LIKE', '%john%') |
IN | Στη λίστα | ->where('status', 'IN', ['active', 'pending']) |
NOT IN | Όχι στη λίστα | ->where('id', 'NOT IN', [1, 2, 3]) |
BETWEEN | Εύρος | ->where('age', 'BETWEEN', [18, 65]) |
IS NULL | Είναι μηδενικό | ->where('deleted_at', 'IS NULL') |
IS NOT NULL | Μη μηδενικό | ->where('deleted_at', 'IS NOT NULL') |
Παράδειγμα:
// 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();# ή Πού
Ενότητα με τίτλο «# ή Πού»Προσθέτει μια συνθήκη OR.
public function orWhere(string $column, string $operator = '=', mixed $value = null): selfΠαράδειγμα:
QueryBuilder::table('users') ->select('*') ->where('status', '=', 'active') ->orWhere('premium', '=', 1) ->get(); // SELECT * FROM users WHERE status = 'active' OR premium = 1# WhereIn / WhereNotIn
Ενότητα με τίτλο «# WhereIn / WhereNotIn»Μέθοδοι ευκολίας για IN/NOT IN.
public function whereIn(string $column, array $values): selfpublic function whereNotIn(string $column, array $values): selfΠαράδειγμα:
QueryBuilder::table('posts') ->select('*') ->whereIn('status', ['published', 'scheduled']) ->get();
QueryBuilder::table('comments') ->select('*') ->whereNotIn('spam_score', [8, 9, 10]) ->get();# whereNull / whereNotNull
Ενότητα με τίτλο «# whereNull / whereNotNull»Εύκολες μέθοδοι για ελέγχους NULL.
public function whereNull(string $column): selfpublic function whereNotNull(string $column): selfΠαράδειγμα:
QueryBuilder::table('users') ->select('*') ->whereNotNull('verified_at') ->get();# όπου Μεταξύ
Ενότητα με τίτλο «# όπου Μεταξύ»Ελέγχει εάν η τιμή είναι μεταξύ δύο τιμών.
public function whereBetween(string $column, array $values): selfΠαράδειγμα:
QueryBuilder::table('products') ->select('*') ->whereBetween('price', [10, 100]) ->get();
QueryBuilder::table('orders') ->select('*') ->whereBetween('created_at', ['2024-01-01', '2024-12-31']) ->get();# εγγραφείτε
Ενότητα με τίτλο «# εγγραφείτε»Προσθέτει ένα INNER JOIN.
public function join( string $table, string $first, string $operator = '=', string $second = null): selfΠαράδειγμα:
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();# αριστεράΣυμμετοχή / δεξιάΕγγραφή
Ενότητα με τίτλο «# αριστεράΣυμμετοχή / δεξιάΕγγραφή»Εναλλακτικοί τύποι ενώσεων.
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Παράδειγμα:
QueryBuilder::table('users') ->select('users.*', 'COUNT(posts.id) as post_count') ->leftJoin('posts', 'users.id', '=', 'posts.user_id') ->groupBy('users.id') ->get();# groupBy
Ενότητα με τίτλο «# groupBy»Ομαδοποιήστε τα αποτελέσματα κατά στήλες.
public function groupBy(...$columns): selfΠαράδειγμα:
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();# έχοντας
Ενότητα με τίτλο «# έχοντας»Προσθέτει μια συνθήκη HAVING.
public function having(string $column, string $operator = '=', mixed $value = null): selfΠαράδειγμα:
QueryBuilder::table('orders') ->select('user_id', 'COUNT(*) as order_count') ->groupBy('user_id') ->having('order_count', '>', 5) ->get();# παραγγελίαΑπό
Ενότητα με τίτλο «# παραγγελίαΑπό»Αποτελέσματα παραγγελιών.
public function orderBy(string $column, string $direction = 'ASC'): selfΠαράμετροι:
| Παράμετρος | Τύπος | Περιγραφή |
|---|---|---|
$column | χορδή | Στήλη κατά παραγγελία κατά |
$direction | χορδή | ASC ή DESC |
Παράδειγμα:
// 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();# όριο / μετατόπιση
Ενότητα με τίτλο «# όριο / μετατόπιση»Περιορίζει και αντισταθμίζει τα αποτελέσματα.
public function limit(int $limit): selfpublic function offset(int $offset): selfΠαράδειγμα:
// 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();Μέθοδοι Εκτέλεσης
Ενότητα με τίτλο «Μέθοδοι Εκτέλεσης»# πάρτε
Ενότητα με τίτλο «# πάρτε»Εκτελεί το ερώτημα και επιστρέφει όλα τα αποτελέσματα.
public function get(): arrayΕπιστρέφει: array - Πίνακας σειρών αποτελεσμάτων
Παράδειγμα:
$users = QueryBuilder::table('users') ->select('id', 'username', 'email') ->where('status', '=', 'active') ->orderBy('username') ->get();
foreach ($users as $user) { echo $user['username'] . ' (' . $user['email'] . ')' . "\n";}# πρώτα
Ενότητα με τίτλο «# πρώτα»Παίρνει το πρώτο αποτέλεσμα.
public function first(): ?arrayΕπιστρέφει: ?array - Πρώτη σειρά ή μηδενική
Παράδειγμα:
$user = QueryBuilder::table('users') ->select('*') ->where('id', '=', 123) ->first();
if ($user) { echo 'Found: ' . $user['username'];}# τελευταίο
Ενότητα με τίτλο «# τελευταίο»Παίρνει το τελευταίο αποτέλεσμα.
public function last(): ?arrayΠαράδειγμα:
$latestPost = QueryBuilder::table('posts') ->select('*') ->orderBy('created_at', 'DESC') ->last();# μέτρηση
Ενότητα με τίτλο «# μέτρηση»Λαμβάνει τον αριθμό των αποτελεσμάτων.
public function count(): intΕπιστροφές: int - Αριθμός σειρών
Παράδειγμα:
$activeUsers = QueryBuilder::table('users') ->where('status', '=', 'active') ->count();
echo "Active users: $activeUsers";Το ### υπάρχει
Ελέγχει εάν το ερώτημα επιστρέφει αποτελέσματα.
public function exists(): boolΕπιστρέφει: bool - Σωστό εάν υπάρχουν αποτελέσματα
Παράδειγμα:
if (QueryBuilder::table('users')->where('email', '=', 'test@example.com')->exists()) { echo 'User already exists';}# συγκεντρωτικό
Ενότητα με τίτλο «# συγκεντρωτικό»Λαμβάνει συγκεντρωτικές τιμές.
public function aggregate(string $function, string $column): mixedΠαράδειγμα:
$maxPrice = QueryBuilder::table('products') ->aggregate('MAX', 'price');
$avgAge = QueryBuilder::table('users') ->aggregate('AVG', 'age');
$totalSales = QueryBuilder::table('orders') ->aggregate('SUM', 'total');INSERT Ερωτήματα
Ενότητα με τίτλο «INSERT Ερωτήματα»# ένθετο
Ενότητα με τίτλο «# ένθετο»Εισάγει μια σειρά.
public function insert(array $values): boolΠαράδειγμα:
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')]);# εισάγετε Πολλά
Ενότητα με τίτλο «# εισάγετε Πολλά»Εισάγει πολλές σειρές.
public function insertMany(array $rows): boolΠαράδειγμα:
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 Ερωτήματα
Ενότητα με τίτλο «UPDATE Ερωτήματα»# ενημέρωση
Ενότητα με τίτλο «# ενημέρωση»Ενημερώνει τις σειρές.
public function update(array $values): intΕπιστροφές: int - Αριθμός επηρεαζόμενων σειρών
Παράδειγμα:
// 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' ]);# προσαύξηση / μείωση
Ενότητα με τίτλο «# προσαύξηση / μείωση»Αυξάνει ή μειώνει μια στήλη.
public function increment(string $column, int $amount = 1): intpublic function decrement(string $column, int $amount = 1): intΠαράδειγμα:
// Increment view countQueryBuilder::table('posts') ->where('id', '=', 123) ->increment('views');
// Decrement stockQueryBuilder::table('products') ->where('id', '=', 456) ->decrement('stock', 5);DELETE Ερωτήματα
Ενότητα με τίτλο «DELETE Ερωτήματα»# διαγραφή
Ενότητα με τίτλο «# διαγραφή»Διαγράφει σειρές.
public function delete(): intΕπιστρέφει: int - Αριθμός διαγραμμένων σειρών
Παράδειγμα:
// 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();# περικοπή
Ενότητα με τίτλο «# περικοπή»Διαγράφει όλες τις σειρές από τον πίνακα.
public function truncate(): boolΠαράδειγμα:
// Clear all sessionsQueryBuilder::table('sessions')->truncate();Προηγμένες δυνατότητες
Ενότητα με τίτλο «Προηγμένες δυνατότητες»# Ακατέργαστες εκφράσεις
Ενότητα με τίτλο «# Ακατέργαστες εκφράσεις»QueryBuilder::table('products') ->select('id', 'name', QueryBuilder::raw('price * quantity as total')) ->get();# Υποερωτήματα
Ενότητα με τίτλο «# Υποερωτήματα»$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
Ενότητα με τίτλο «# Λήψη του SQL»public function toSql(): stringΠαράδειγμα:
$sql = QueryBuilder::table('users') ->select('id', 'username') ->where('status', '=', 'active') ->toSql();
echo $sql;// SELECT id, username FROM xoops_users WHERE status = ?Πλήρη παραδείγματα
Ενότητα με τίτλο «Πλήρη παραδείγματα»# Σύνθετη επιλογή με συνδέσεις
Ενότητα με τίτλο «# Σύνθετη επιλογή με συνδέσεις»<?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
Ενότητα με τίτλο «# Σελιδοποίηση με QueryBuilder»<?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>';}# Ανάλυση δεδομένων με συγκεντρωτικά στοιχεία
Ενότητα με τίτλο «# Ανάλυση δεδομένων με συγκεντρωτικά στοιχεία»<?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);Βέλτιστες πρακτικές
Ενότητα με τίτλο «Βέλτιστες πρακτικές»- Χρήση παραμετροποιημένων ερωτημάτων - Το QueryBuilder χειρίζεται αυτόματα τη σύνδεση παραμέτρων
- Μέθοδοι αλυσίδας - Αξιοποιήστε τη ρευστική διεπαφή για αναγνώσιμο κώδικα
- Δοκιμή SQL Έξοδος - Χρησιμοποιήστε το
toSql()για να επαληθεύσετε τα ερωτήματα που δημιουργούνται - Χρήση ευρετηρίων - Βεβαιωθείτε ότι οι στήλες με τα συχνά ερωτήματα είναι ευρετηριασμένες
- Περιορισμός αποτελεσμάτων - Να χρησιμοποιείτε πάντα
limit()για μεγάλα σύνολα δεδομένων - Χρησιμοποιήστε Aggregates - Αφήστε τη βάση δεδομένων να κάνει counting/summing αντί για PHP
- Έξοδος διαφυγής - Να γίνεται πάντα διαφυγή από τα εμφανιζόμενα δεδομένα με το
htmlspecialchars() - Απόδοση ευρετηρίου - Παρακολουθήστε αργά ερωτήματα και βελτιστοποιήστε ανάλογα
Σχετική τεκμηρίωση
Ενότητα με τίτλο «Σχετική τεκμηρίωση»- XoopsDatabase - Επίπεδο βάσης δεδομένων και συνδέσεις
- Κριτήρια - Σύστημα ερωτημάτων που βασίζεται σε κριτήρια παλαιού τύπου
- ../Core/XoopsObject - Εμμονή αντικειμένου δεδομένων
- ../Module/Module-System - Λειτουργίες βάσης δεδομένων μονάδας
Δείτε επίσης: XOOPS Βάση δεδομένων API