Laravel / دليل حلول تحريري
استعلاماتN+1 والعلاقات الغائبة وافتراضات الكتابة غير الآمنة
افحصEloquent بالمخطط والمفاتيح والنطاق والعدد والحقول. افصل الأداء والغياب والتصريح في التشخيص.
قاعدة معرفة للقراءة فقط · بلا تعليقات عامة
تعرّف على الأعراض
تبطؤ القائمة مع الصفوف أو يغيب المؤلف أو يهملcreate حقلاً. احفظ حالة مصطنعة بالمخطط والمفاتيح والنموذج والعلاقات والحقول والعدد. قد يصح المظهر مع استعلام إضافي لكل صف.
افهم الأسباب المحتملة
- تشمل الأسباب العلاقة الكسولة والمفتاح الخاطئ وحذف مفتاح منselect والنطاق والتعيين والحالة القديمة. ليس العثور إذناً، وقد يخفي توسيع النطاق والكتابة العرض بثغرة.
1. كتابة عقد العلاقة قبل تغيير الاستعلام
حدد الجداول والمفاتيح وnull والحذف والمستأجر وطابق النموذج والتوقيت والتحويل. لا يثبت الاسم المفتاح. ميّز الغياب من النطاق ولا تزله لأن غير المقيد يجد السجل. استخدم مالكاً مسموحاً وآخر ممنوعاً مصطنعين.
2. عد الاستعلامات حول العملية المقصودة
راقب بمعزل دون معاملات خاصة واستبعد البناء والتجهيز من القياس. حمّل المطلوب وافحص العدد والقيم. يعلن المثال كل جدول وعلاقة ويتوقع قراءتين لثلاثة منشورات. يثبت المحلي لا خطة المحرك والمراقب والنطاق والإذن، ولا تعمم سرعة عينة صغيرة.
<?php
declare(strict_types=1);
require __DIR__ . '/vendor/autoload.php';
$db = new Illuminate\Database\Capsule\Manager();
$db->addConnection(['driver' => 'sqlite', 'database' => ':memory:', 'prefix' => '', 'foreign_key_constraints' => true]);
$db->setAsGlobal();
$db->bootEloquent();
$db->schema()->create('authors', function (Illuminate\Database\Schema\Blueprint $t) { $t->id(); $t->string('name'); });
$db->schema()->create('posts', function (Illuminate\Database\Schema\Blueprint $t) { $t->id(); $t->integer('author_id'); $t->string('title'); });
final class AuthorRow extends Illuminate\Database\Eloquent\Model { protected $table = 'authors'; public $timestamps = false; }
final class PostRow extends Illuminate\Database\Eloquent\Model {
protected $table = 'posts'; public $timestamps = false;
public function author() { return $this->belongsTo(AuthorRow::class, 'author_id'); }
}
$db->table('authors')->insert([['id' => 1, 'name' => 'Ada'], ['id' => 2, 'name' => 'Bob']]);
$db->table('posts')->insert([['author_id' => 1, 'title' => 'A'], ['author_id' => 2, 'title' => 'B'], ['author_id' => 1, 'title' => 'C']]);
$db->connection()->enableQueryLog();
$posts = PostRow::with('author')->orderBy('id')->get();
echo $posts->map(fn($post) => $post->author->name)->implode(','), PHP_EOL;
echo count($db->connection()->getQueryLog()), PHP_EOL;
Ada,Bob,Ada
2
تغطي قراءة المنشورات والمؤلفين الحلقة دون نماذج المشروع وقاعدته ومستخدميه.
3. إصلاح المفاتيح والاختيار دون توسيع الوصول
أبقِ مفاتيح المطابقة عنداختيار أعمدة قليلة وصحح المخصص وتعامل معnullable. اختر التحميل أو التجميع المناسب لا كل الأبناء لعدد. احفظ المستأجر والملكية بالاستعلامين. يختلف مؤلف اختياري من مرجع إلزامي مكسور. اختبر الفارغ والواحد وعدة آباء حتى لا تخفي العينة الخطأ.
4. فحص الكتابة بالمدخل المختار والحالة النهائية
افحص الصالح وfillable/guarded والتحويل والمراقب قبل الحماية. يختلف الإسناد المباشر فلا يثبت الإعداد الإذن. أبعد السعر والدور والمستأجر عن الخارج. أعد القراءة للحقول وافحص المعاملة للمترابط. لا تثبت الاستجابة الناجحة كل حفظ ولا الرفض غياب الجزئي.
تحقق من نجاح الإصلاح
كرر الحالة وقارن المعرف والعدد والحقول والحفظ وأضف مالكاً آخر وعلاقة اختيارية غائبة وإلزامية مكسورة وحساساً زائداً. افحص المحرك المقصود لما يخصه ولا تعممSQLite.
امنع تكرار المشكلة
- صرح بالمفاتيح والكتابة عند اختلاف العادة ونظف المراقبة وحمّل المقصود واحفظ بيانات متعددة. راجع النطاق والإذن عند تغيير الاستعلام والتسلسل.