قصاصات لارافيل

ترتيب العناصر OrderBy حسب العلاقات في الـ model


نستطيع عمل ترتيب للبيانات OrderBy مباشرة من خلال العلاقات في الـ model

public function products(){
    return $this->hasMany(Product::class);
}
public function productsByName(){
    return $this->hasMany(Product::class)->orderBy('name');
}

hasMany ، تحديد عدد السجلات


بإستخدام العلاقة 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'];
}

إستخدام withCount لحساب عدد الحقول الأبناء


إذا كان لدينا علاقة 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();


عمل filter إضافي عند عمل إستعلام بالعلاقات


اذا أردنا أن نجلب بيانات من الجدول الأب مع بيانات من جدول الإبن، نستطيع عمل محددات او ترتيب داخل الدالة، على سبيل المثال، إذا أردنا أن نجلب الدول مع أكبر 3 مدن 

$countries = Country::with(['cities' => function($query) {
    $query->orderBy('population', 'desc');
    $query->take(3);
}])->get();

التحقق إذا كان ملف blade موجود


تستطيع التحقق من ملف blade إذا كان موجود أم لا قبل تحميل الملف

if (view()->exists('custom.page')) {
 // Load the view
}

كما نستطيع وضع مصفوفه من الملفات

return view()->first(['custom.dashboard', 'dashboard'], $data);

صفحة خطأ مخصصة لأخطاء HTTP Code


إذا أردنا إنشاء صفحة خطأ مخصصة لأي خطأ من أخطاء HTTP Code مثل 500، فقط نقوم بإنشاء ملف blade مع رقم الخطأ

resources/views/errors/500.blade.php
403.blade.php 

وهكذا، ويتم تحميلها مباشرة عندما يحصل الخطأ

المتغير loop في foreach في laravel blade


بداخل الـ 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

كما يوجد العديد من الخواص يمكن الإطلاع عليها من هنا

التحقق من الدخول auth في blade


بدلا من إستخدام الجملة الشرطية 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 Directives: IncludeIf, IncludeWhen, IncludeFirst


إذا كنا غير متأكدين من أن ملف blade موجود بالإمكان الإستعاة بأحد الشروط التالية

سيتم تحميل ملف الهيدر إذا كان ملف blade موجود

@includeIf('partials.header')

سيتم تحميل الهيدر فقط إذا كانت role=1

@includeWhen(auth()->user()->role_id == 1, 'partials.header')

اذا كان ملف adminlte.header واذا كان غير موجود يتم تحميل ملف default.header

@includeFirst('adminlte.header', 'default.header')

إرجاع رسالة خطأ من خلال ملف route بدلا من صفحة 404


إذا كناا نريد تحديد روابط لإرجاع رسائل خطأ، بدلا من صفحة 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?';
});

Query string parameters to Routes


إذا قمنا بتمرير باراميترز إضافيه للـ route في مصفوفة ، هذه المفاتيح => والقيم ، بشكل تلقائي سوف يتم إضافتها للرابط

Route::get('user/{id}/profile', function ($id) {
    //
})->name('profile');
 
$url = route('profile', ['id' => 1, 'photos' => 'yes']); // Result: /user/1/profile?photos=yes

التحقق من أبعاد الصورة في laravel


عند رفع الصور، نستطيع التحقق من أبعاد هذه الصورة بشكل إجباري

['photo' => 'dimensions:max_width=4096,max_height=4096']

التحقق من التاريخ بإستخدام كلمات now, yesterday


نستطيع عمل تحقق للوقت من خلال إستخدام before/after ومن ثم تمرير معلمات مثل tomorrow, now, yesterday 

$rules = [
    'start_date' => 'after:tomorrow',
    'end_date' => 'after:start_date'
];

تغيير رسالة التحقق الإفتراضيه في laravel


إذا أردنا تغيير رسالة الخطأ الإفتراضي في عمليات التحقق، يجب إضافة دالة 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',
]);