نستطيع عمل ترتيب للبيانات OrderBy مباشرة من خلال العلاقات في الـ model
public function products(){ return $this->hasMany(Product::class); } public function productsByName(){ return $this->hasMany(Product::class)->orderBy('name'); }
بإستخدام العلاقة hasMany، نستطيع عمل فلترة للسجلات التي تحتوي على عدد X من الأبناء
// Author -> hasMany(Book::class) $authors = Author::has('books', '>', 5)->get();
إذا أردنا عند تحديث حقل أأن يتم تحديث updated_at للأب ، يمكن عمل ذلك من خلال إستخدام $touches، مثال :- عند إضافة تعليق على مقال post، نريد أن يتم تحديث تاريخ تعديل المقال نفسة، يتم ذلك من خلال إضافة $touches->post في comment model
class Comment extends Model{ protected $touches = ['post']; }
إذا كان لدينا علاقة hasMany ونريد إظهار الجدول الأب مع عدد الأبناء، لا يجب كتابة جملة إستعلام أخرى، مثلا اذا كان لدينا جدول الأقسام cats ونريد إستخراج أسماء الأقسام مع عدد المنتجات في كل قسم
public function index(){ $cat=Cat::select('id','title')->withCount('product')->get(); return $catt; }
النتيجة تكون كما يلي
{ "id": 3, "title": "Computer, Office & Security", "product_count": 2 }, { "id": 4, "title": "Bags & Shoes", "product_count": 2 }
كما تمرير مصفوفة من الحقول الى withCount
Cat::select('id','title')->withCount(['product','comments'])->get();
كما نستطيع عمل ترتيب حسب عدد الأبناء (المنتجات)
Cat::withCount('product')->orderBy('product_count', 'desc')->get();
اذا أردنا أن نجلب بيانات من الجدول الأب مع بيانات من جدول الإبن، نستطيع عمل محددات او ترتيب داخل الدالة، على سبيل المثال، إذا أردنا أن نجلب الدول مع أكبر 3 مدن
$countries = Country::with(['cities' => function($query) { $query->orderBy('population', 'desc'); $query->take(3); }])->get();
تستطيع التحقق من ملف blade إذا كان موجود أم لا قبل تحميل الملف
if (view()->exists('custom.page')) { // Load the view }
كما نستطيع وضع مصفوفه من الملفات
return view()->first(['custom.dashboard', 'dashboard'], $data);
إذا أردنا إنشاء صفحة خطأ مخصصة لأي خطأ من أخطاء HTTP Code مثل 500، فقط نقوم بإنشاء ملف blade مع رقم الخطأ
resources/views/errors/500.blade.php 403.blade.php
وهكذا، ويتم تحميلها مباشرة عندما يحصل الخطأ
بداخل الـ loop في ملفات blade نستطيع التحقق إذا كانت النتيجة هي الأولى أو الأخيره أو تحمل الرقم زوجي أو فردي فقط من خلال loop
@foreach ($users as $user) @if ($loop->first) This is the first iteration. @endif @if ($loop->last) This is the last iteration. @endif <p>This is user {{ $user->id }}</p> @endforeach
كما يوجد العديد من الخواص يمكن الإطلاع عليها من هنا
بدلا من إستخدام الجملة الشرطية if-statement للتحقق إذا كان المستخدم مسجل دخول أو لا، يمكن إستخدام @auth مباشرة
@if(auth()->user()) // The user is authenticated. @endif Shorter: @auth // The user is authenticated. @endauth The opposite is @guest directive: @guest // The user is not authenticated. @endguest
إذا كنا غير متأكدين من أن ملف blade موجود بالإمكان الإستعاة بأحد الشروط التالية
سيتم تحميل ملف الهيدر إذا كان ملف blade موجود
@includeIf('partials.header')
سيتم تحميل الهيدر فقط إذا كانت role=1
@includeWhen(auth()->user()->role_id == 1, 'partials.header')
اذا كان ملف adminlte.header واذا كان غير موجود يتم تحميل ملف default.header
@includeFirst('adminlte.header', 'default.header')
إذا كناا نريد تحديد روابط لإرجاع رسائل خطأ، بدلا من صفحة 404 الإفتراضيه، يمكن إنشاء رابط خاص لذلك بنهاية صفحة routes
Route::group(['middleware' => ['auth'], 'prefix' => 'admin', 'as' => 'admin.'], function () { Route::get('/home', 'HomeController@index'); Route::resource('tasks', 'Admin\TasksController'); }); // Some more routes.... Route::fallback(function() { return 'Hm, why did you land here somehow?'; });
إذا قمنا بتمرير باراميترز إضافيه للـ route في مصفوفة ، هذه المفاتيح => والقيم ، بشكل تلقائي سوف يتم إضافتها للرابط
Route::get('user/{id}/profile', function ($id) { // })->name('profile'); $url = route('profile', ['id' => 1, 'photos' => 'yes']); // Result: /user/1/profile?photos=yes
عند رفع الصور، نستطيع التحقق من أبعاد هذه الصورة بشكل إجباري
['photo' => 'dimensions:max_width=4096,max_height=4096']
نستطيع عمل تحقق للوقت من خلال إستخدام before/after ومن ثم تمرير معلمات مثل tomorrow, now, yesterday
$rules = [ 'start_date' => 'after:tomorrow', 'end_date' => 'after:start_date' ];
إذا أردنا تغيير رسالة الخطأ الإفتراضي في عمليات التحقق، يجب إضافة دالة message أسفل rules
class StoreUserRequest extends FormRequest{ public function rules() { return ['name' => 'required']; } public function messages() { return ['name.required' => 'User name should be real name']; } }
بالوضع الإفتراضي، laravel validation error تقوم بإرجال قائمة بالأخطاء، لأنها تتحقق من جميع rules، لكن إذا أردنا أن تقف عملية التحقق بعد أول خطأ يمكن إستخدام bail
$request->validate([ 'title' => 'bail|required|unique:posts|max:255', 'body' => 'required', ]);