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

دوال للتعامل مع الوقت بسهولة في eloquent


دول للتعامل مع الوقت بسهولة في eloquent

$products = Product::whereDate('created_at', '2018-01-31')->get();
$products = Product::whereMonth('created_at', '12')->get();
$products = Product::whereDay('created_at', '31')->get();
$products = Product::whereYear('created_at', date('Y'))->get();
$products = Product::whereTime('created_at', '=', '14:13:58')->get();

زيادة أو نقصان قيمة الحقل بإستخدام دوال increment, decrement


إذا كنت تريد زيادة رقم أو إنقاصه بالإمكان إستخدام  increment, decrement، بالوضع الإفتراضي تتم الزيادة/ النقصان بـ 1، لكن نستطيع أيضا تحديد مقدار الزيادة مثلا 50.

Post::find($post_id)->increment('view_count');
User::find($user_id)->increment('points', 50);
Post::find($post_id)->decrement('view_count');
User::find($user_id)->decrement('points', 50);

اذا كان الموديل لا يحتوي على حقول timestamp الإفتراضية


إذا كان الجدول لا يحتوي على حقول  timestamp   الإفتراضية وهي updated_at, created_at يجب إعلام الـ mode   بذلك من خلال  $temestamps=false

class Company extends Model{
    public $timestamps = false;
}

تغيير أسماء حقول timestamp الإفتراضية في laravel


إذا أردنا تغيير أسماء حقول timestamp الإفتراضية وهي created_at, updated_at إلى أسماء أخرى مثل create_time, update_time ، يجب تحديد ذلك بالموديل

class Role extends Model{
     const CREATED_AT = 'create_time';
     const UPDATED_AT = 'update_time';
 }

التجميع group by بإستخدام الحرف الأول


نستطيع عمل group للبيانات بأي شرط، مثال على عمل group حسب الحرف الأول من الإسم

$users = User::all()->groupBy(function($item) {
    return $item->name[0];
});

حقل لا يتم تحديثة أبدا


إذا كان لدينا حقل ولا نريد أن يتم التعديل عليه، نستطيع وضع قيود من خلال Model مع إستخدام Mutator

class User extends Model{
    public function setEmailAttribute($value){
        if ($this->email) {
            return;
        }
        $this->attributes['email'] = $value;
    }
}

الترقيم المبسط للصفحات simplePagination


في ترقيم الصفحات pagination إذا كنا نريد فقط next/previous عوضا عن الأرقام، فقط نستبدل paginate بـ simplePaginate، كما أن هذه الطريقة تخفف حمل على قاعدة البيانات fewer DB queries

// Instead of 
$users = User::paginate(10);
// You can do this
$users = User::simplePaginate(10);

الحصول على التاريخ دون الدقائق / الثواني بإستخدام Carbon


اذا كنا نريد الوقت دون الدقائق / الثواني، بالإمكان إستخدام دوال Carbon الجاهزه مثل setSeconds(0) و setMinutes(0)

// 2020-04-20 08:12:34
echo now();
// 2020-04-20 08:12:00
echo now()->setSeconds(0);
// 2020-04-20 08:00:00
echo now()->setSeconds(0)->setMinutes(0);
// Another way - even shorter
echo now()->startOfHour();

إستخدام dd بشكل أسرع


عوضا عن إستخدام dd($result)  بالإمكان وضع ->dd() كـ method مباشرة في نهاية جملة query او collection

// Instead of
$users = User::where('name', 'Ethar')->get();
dd($users);
// Do this
$users = User::where('name', 'Ethar')->get()->dd();

تغيير حقل البحث الإفتراضي في eloquent find, findOrFail


 

بالوضع الإفتراضي يتم البحث في لارافيل بإستخدام find, findOrFail في حقل id، لكن اذا كنا نريد تغيير هذا الحقل يجب إن يتم تحديد ذلك في الـ model

model

class Product extends Model{
    protected $primaryKey = 'title';
    //tell Laravel to use title as primary key
}

eloquent

public function search(Request $request){
    $user = Product::findOrFail($request->title);
    return $user;
}

البحث في laravel بإستخدام firstOrFail


 بالإضافة إلى findOrFail، يوجد دالة firstOrFail حيث تقوم بإرجاع صفحة 404 اذا لم يكن هناك نتائج للبحث

$user = User::where('email', ccc@ccc.com')->firstOrFail();

البحث حسب التاريخ في laravel


عند جلب البيانات حسب جدول التاريخ بدلا من إستخدام 

User::orderBy('created_at', 'desc')->get();

نستطيع عمل ذلك بشكل أسرع، ويتم الترتيب بشكل desc

User::latest()->get();

بالوضع الإفتراضي latest تقوم بالترتيب حسب حقل created_at

اذا كنا نريد الترتيب بشكل ascending يمكن إستخدام oldest

User::oldest()->get();

كما نستطيع تغيير جدول البحث الإفتراضي من created_at الى updated_at

$lastUpdatedUser = User::latest('updated_at')->first();

إستخدام db raw للقيام بعمليات calculation في query


 

يفضل إستخدام دوال DB Raw مثل whereRaw لعمل عمليات حسابيه مباشرة في جملة sql حيث تظهر النتائج بشكل أسرع، مثال اذا أردنا جلب المستخدمين الذين قامو بالتسجيل والفعالين خلال 30 يوم

User::where('active', 1)
    ->whereRaw('TIMESTAMPDIFF(DAY, created_at, updated_at) > ?', 30)
    ->get();

إخفاء بعض الحقول في eloquent


عند عمل إستعلام بإستخدام eloquent إذا كنا نريد إخفاء بعض الحقول من النتائج، ببساطه يمكن إضافة makeHidden

Snippet::all()->makeHidden(['created_at', 'updated_at']);

إستخدام DB transactions


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

DB::transaction(function () {
    DB::table('users')->update(['votes' => 1]);
    DB::table('posts')->delete();
});

للمزيد من هنا

تغيير تنسيق حقول timestamp


لتغيير تنسيق حقول timestamp نستطيع إضافة دوال لذلك في الـ model

public function getCreatedAtFormattedAttribute(){
   return $this->created_at->format('H:i d, M Y');
}

public function getUpdatedAtFormattedAttribute(){
   return $this->updated_at->format('H:i d, M Y');
}