استخدام قاعدة البيانات (بناءً على مكون قاعدة بيانات Laravel)
الحصول على جميع الصفوف
<?php
namespace app\controller;
use support\Request;
use support\Db;
class UserController
{
public function all(Request $request)
{
$users = Db::table('users')->get();
return view('user/all', ['users' => $users]);
}
}
الحصول على أعمدة محددة
$users = Db::table('user')->select('name', 'email as user_email')->get();
الحصول على صف واحد
$user = Db::table('users')->where('name', 'John')->first();
الحصول على عمود واحد
$titles = Db::table('roles')->pluck('title');
قم بتحديد قيمة حقل id كمؤشر
$roles = Db::table('roles')->pluck('title', 'id');
foreach ($roles as $id => $title) {
echo $title;
}
الحصول على قيمة واحدة (حقل)
$email = Db::table('users')->where('name', 'John')->value('email');
إزالة التكرارات
$email = Db::table('user')->select('nickname')->distinct()->get();
نتائج التجزئة
إذا كنت بحاجة إلى معالجة آلاف سجلات قاعدة البيانات، فإن قراءة هذه البيانات دفعة واحدة يمكن أن تكون مستهلكة للوقت وقد تؤدي إلى تجاوز الذاكرة. في هذه الحالة، يمكنك التفكير في استخدام chunkById . هذه الطريقة تحصل على جزء صغير من مجموعة النتائج مرة واحدة، وتقوم بتمريرها إلى دالة مجهولة للقيام بالمعالجة. على سبيل المثال، يمكننا تقسيم جميع بيانات جدول users إلى قطع تحتوي كل واحدة منها على 100 سجل:
Db::table('users')->orderBy('id')->chunkById(100, function ($users) {
foreach ($users as $user) {
//
}
});
يمكنك إنهاء الحصول على نتائج التجزئة عن طريق إرجاع false من داخل الدالة المجهولة.
Db::table('users')->orderBy('id')->chunkById(100, function ($users) {
// معالجة السجلات...
return false;
});
ملاحظة: لا تقم بحذف البيانات داخل الاستدعاء، فقد يؤدي ذلك إلى عدم تضمين بعض السجلات في مجموعة النتائج
التجميع
يوفر مُنشئ الاستعلام أيضًا طرق تجميع متنوعة، مثل count، max، min، avg، sum، إلخ.
$users = Db::table('users')->count();
$price = Db::table('orders')->max('price');
$price = Db::table('orders')->where('finalized', 1)->avg('price');
التحقق مما إذا كانت السجلات موجودة
return Db::table('orders')->where('finalized', 1)->exists();
return Db::table('orders')->where('finalized', 1)->doesntExist();
التعابير الأصلية
النموذج
selectRaw($expression, $bindings = [])
أحيانًا قد تحتاج إلى استخدام تعابير أصلية في الاستعلامات. يمكنك استخدام selectRaw()
لإنشاء تعبير أصلي:
$orders = Db::table('orders')
->selectRaw('price * ? as price_with_tax', [1.0825])
->get();
هناك أيضًا طرق تعبير أصلية أخرى مثل whereRaw()
و orWhereRaw()
و havingRaw()
و orHavingRaw()
و orderByRaw()
و groupByRaw()
.
Db::raw($value)
أيضًا يُستخدم لإنشاء تعبير أصلي، لكنه لا يحتوي على إمكانية ربط المعلمات، لذا يجب أن تكون حذرًا من مشكلات حقن SQL عند استخدامه.
$orders = Db::table('orders')
->select('department', Db::raw('SUM(price) as total_sales'))
->groupBy('department')
->havingRaw('SUM(price) > ?', [2500])
->get();
جملة Join
// join
$users = Db::table('users')
->join('contacts', 'users.id', '=', 'contacts.user_id')
->join('orders', 'users.id', '=', 'orders.user_id')
->select('users.*', 'contacts.phone', 'orders.price')
->get();
// leftJoin
$users = Db::table('users')
->leftJoin('posts', 'users.id', '=', 'posts.user_id')
->get();
// rightJoin
$users = Db::table('users')
->rightJoin('posts', 'users.id', '=', 'posts.user_id')
->get();
// crossJoin
$users = Db::table('sizes')
->crossJoin('colors')
->get();
جملة Union
$first = Db::table('users')
->whereNull('first_name');
$users = Db::table('users')
->whereNull('last_name')
->union($first)
->get();
جملة Where
النموذج
where($column, $operator = null, $value = null)
المعلمة الأولى هي اسم العمود، والثانية هي أي مشغل مدعوم من قبل قاعدة البيانات، والثالثة هي القيمة που سيتم مقارنتها مع هذا العمود.
$users = Db::table('users')->where('votes', '=', 100)->get();
// عندما يكون المشغل هو علامة التساوي، يمكن الاستغناء عنه، لذا فإن هذه العبارة لها نفس تأثير السابقة
$users = Db::table('users')->where('votes', 100)->get();
$users = Db::table('users')
->where('votes', '>=', 100)
->get();
$users = Db::table('users')
->where('votes', '<>', 100)
->get();
$users = Db::table('users')
->where('name', 'like', 'T%')
->get();
يمكنك أيضًا تمرير مصفوفة شروط إلى دالة where:
$users = Db::table('users')->where([
['status', '=', '1'],
['subscribed', '<>', '1'],
])->get();
تستقبل دالة orWhere المعلمات نفسها مثل دالة where:
$users = Db::table('users')
->where('votes', '>', 100)
->orWhere('name', 'John')
->get();
يمكنك تمرير دالة مجهولة إلى دالة orWhere كأول معلمة:
// SQL: select * from users where votes > 100 or (name = 'Abigail' and votes > 50)
$users = Db::table('users')
->where('votes', '>', 100)
->orWhere(function($query) {
$query->where('name', 'Abigail')
->where('votes', '>', 50);
})
->get();
تحقق whereBetween / orWhereBetween مما إذا كانت قيمة الحقل بين قيمتين محددتين:
$users = Db::table('users')
->whereBetween('votes', [1, 100])
->get();
تحقق whereNotBetween / orWhereNotBetween مما إذا كانت قيمة الحقل خارج قيمتين محددتين:
$users = Db::table('users')
->whereNotBetween('votes', [1, 100])
->get();
تحقق whereIn / whereNotIn / orWhereIn / orWhereNotIn مما إذا كانت قيم الحقل موجودة في المصفوفة المحددة:
$users = Db::table('users')
->whereIn('id', [1, 2, 3])
->get();
تحقق whereNull / whereNotNull / orWhereNull / orWhereNotNull مما إذا كان الحقل المحدد يجب أن يكون NULL:
$users = Db::table('users')
->whereNull('updated_at')
->get();
تحقق whereNotNull مما إذا كان الحقل المحدد يجب ألا يكون NULL:
$users = Db::table('users')
->whereNotNull('updated_at')
->get();
تحقق whereDate / whereMonth / whereDay / whereYear / whereTime لمقارنة قيمة الحقل بالتاريخ المحدد:
$users = Db::table('users')
->whereDate('created_at', '2016-12-31')
->get();
تحقق whereColumn / orWhereColumn لمقارنة قيم حقلين لمعرفة ما إذا كانت متساوية:
$users = Db::table('users')
->whereColumn('first_name', 'last_name')
->get();
// يمكنك أيضًا تمرير مشغل مقارنة
$users = Db::table('users')
->whereColumn('updated_at', '>', 'created_at')
->get();
// يمكن أيضًا تمرير مصفوفة إلى دالة whereColumn
$users = Db::table('users')
->whereColumn([
['first_name', '=', 'last_name'],
['updated_at', '>', 'created_at'],
])->get();
تجميع المعلمات
// select * from users where name = 'John' and (votes > 100 or title = 'Admin')
$users = Db::table('users')
->where('name', '=', 'John')
->where(function ($query) {
$query->where('votes', '>', 100)
->orWhere('title', '=', 'Admin');
})
->get();
whereExists
// select * from users where exists (select 1 from orders where orders.user_id = users.id)
$users = Db::table('users')
->whereExists(function ($query) {
$query->select(Db::raw(1))
->from('orders')
->whereRaw('orders.user_id = users.id');
})
->get();
orderBy
$users = Db::table('users')
->orderBy('name', 'desc')
->get();
الترتيب العشوائي
$randomUser = Db::table('users')
->inRandomOrder()
->first();
الترتيب العشوائي قد يؤثر بشكل كبير على أداء الخادم، لذا لا يُفضل استخدامه
groupBy / having
$users = Db::table('users')
->groupBy('account_id')
->having('account_id', '>', 100)
->get();
// يمكنك تمرير عدة معلمات إلى دالة groupBy
$users = Db::table('users')
->groupBy('first_name', 'status')
->having('account_id', '>', 100)
->get();
offset / limit
$users = Db::table('users')
->offset(10)
->limit(5)
->get();
إدراج
إدراج سجل واحد
Db::table('users')->insert(
['email' => 'john@example.com', 'votes' => 0]
);
إدراج سجلات متعددة
Db::table('users')->insert([
['email' => 'taylor@example.com', 'votes' => 0],
['email' => 'dayle@example.com', 'votes' => 0]
]);
ID تلقائي
$id = Db::table('users')->insertGetId(
['email' => 'john@example.com', 'votes' => 0]
);
ملاحظة: عند استخدام PostgreSQL، ستقوم دالة insertGetId افتراضيًا بإدراج id كمجال تم تكوينه تلقائيًا. إذا كنت ترغب في الحصول على ID من "تسلسل" آخر، يمكنك تمرير اسم الحقل كمعلمة ثانية لدالة insertGetId.
تحديث
$affected = Db::table('users')
->where('id', 1)
->update(['votes' => 1]);
تحديث أو إدراج
في بعض الأحيان قد ترغب في تحديث سجل موجود في قاعدة البيانات، أو إذا لم يكن هناك سجل مطابق، فقم بإنشاءه:
Db::table('users')
->updateOrInsert(
['email' => 'john@example.com', 'name' => 'John'],
['votes' => '2']
);
تحاول updateOrInsert إيجاد سجل في قاعدة البيانات باستخدام زوج المفتاح والقيمة من المعلمة الأولى. إذا كان السجل موجودًا، يتم تحديثه بالقيم الموجودة في المعلمة الثانية. إذا لم يُعثر على سجل، يتم إدراج سجل جديد، وتكون بيانات السجل الجديد عبارة عن تجميع للمصفوفتين.
زيادة & تقليل
تقوم كلتا الطريقتين باستقبال معلمة واحدة على الأقل: العمود الذي يحتاج إلى التعديل. المعلمة الثانية اختيارية، وتُستخدم للتحكم في مقدار الزيادة أو النقص:
Db::table('users')->increment('votes');
Db::table('users')->increment('votes', 5);
Db::table('users')->decrement('votes');
Db::table('users')->decrement('votes', 5);
يمكنك أيضًا تحديد الحقول التي تحتاج لتحديثها أثناء العمليات:
Db::table('users')->increment('votes', 1, ['name' => 'John']);
حذف
Db::table('users')->delete();
Db::table('users')->where('votes', '>', 100)->delete();
إذا كنت بحاجة إلى تفريغ الجدول، يمكنك استخدام طريقة truncate، حيث ستحذف جميع الصفوف وتعيد تعيين ID التلقائي إلى الصفر:
Db::table('users')->truncate();
المعاملات
القفل المتشائم
يتضمن مُنشئ الاستعلام أيضًا بعض الوظائف التي يمكن أن تساعدك في تنفيذ "القفل المتشائم" باستخدام بناء الجملة select. إذا كنت ترغب في تطبيق "قفل مشترك" في الاستعلام، يمكنك استخدام طريقة sharedLock. يمنع القفل المشترك تعديل الصفوف المحددة حتى يتم تقديم المعاملة:
Db::table('users')->where('votes', '>', 100)->sharedLock()->get();
أو يمكنك استخدام طريقة lockForUpdate. يمنع "قفل التحديث" تعديل الصفوف بواسطة قفل مشترك آخر أو تحديدها:
Db::table('users')->where('votes', '>', 100)->lockForUpdate()->get();
التصحيح
يمكنك استخدام dd أو dump لطباعة نتائج الاستعلام أو عبارات SQL. باستخدام دالة dd يمكنك عرض معلومات التصحيح ثم توقيف تنفيذ الطلب. بينما تستعرض دالة dump أيضًا معلومات التصحيح ولكنها لا توقف التنفيذ:
Db::table('users')->where('votes', '>', 100)->dd();
Db::table('users')->where('votes', '>', 100)->dump();
ملاحظة
يحتاج التصحيح إلى تثبيتsymfony/var-dumper
، الأوامر هيcomposer require symfony/var-dumper