دول للتعامل مع الوقت بسهولة في 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، بالوضع الإفتراضي تتم الزيادة/ النقصان بـ 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 الإفتراضية وهي updated_at, created_at يجب إعلام الـ mode بذلك من خلال $temestamps=false
class Company extends Model{ public $timestamps = false; }
إذا أردنا تغيير أسماء حقول timestamp الإفتراضية وهي created_at, updated_at إلى أسماء أخرى مثل create_time, update_time ، يجب تحديد ذلك بالموديل
class Role extends Model{ const CREATED_AT = 'create_time'; const UPDATED_AT = 'update_time'; }
نستطيع عمل 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; } }
في ترقيم الصفحات pagination إذا كنا نريد فقط next/previous عوضا عن الأرقام، فقط نستبدل paginate بـ simplePaginate، كما أن هذه الطريقة تخفف حمل على قاعدة البيانات fewer DB queries
// Instead of $users = User::paginate(10); // You can do this $users = User::simplePaginate(10);
اذا كنا نريد الوقت دون الدقائق / الثواني، بالإمكان إستخدام دوال 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($result) بالإمكان وضع ->dd() كـ method مباشرة في نهاية جملة query او collection
// Instead of $users = User::where('name', 'Ethar')->get(); dd($users); // Do this $users = User::where('name', 'Ethar')->get()->dd();
بالوضع الإفتراضي يتم البحث في لارافيل بإستخدام 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; }
بالإضافة إلى findOrFail، يوجد دالة firstOrFail حيث تقوم بإرجاع صفحة 404 اذا لم يكن هناك نتائج للبحث
$user = User::where('email', ccc@ccc.com')->firstOrFail();
عند جلب البيانات حسب جدول التاريخ بدلا من إستخدام
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 مثل whereRaw لعمل عمليات حسابيه مباشرة في جملة sql حيث تظهر النتائج بشكل أسرع، مثال اذا أردنا جلب المستخدمين الذين قامو بالتسجيل والفعالين خلال 30 يوم
User::where('active', 1) ->whereRaw('TIMESTAMPDIFF(DAY, created_at, updated_at) > ?', 30) ->get();
عند عمل إستعلام بإستخدام eloquent إذا كنا نريد إخفاء بعض الحقول من النتائج، ببساطه يمكن إضافة makeHidden
Snippet::all()->makeHidden(['created_at', 'updated_at']);
اذا كنا نتعامل مع علمية إدخال لجدولين، ربما يحصل خطأ أثناء إدخال البيانات للجدول الثاني، بالتالي يجب عمل تراجع عن البيانات المدخلة للجدول الأول، لذلك ينصح بإستخدام Transactions
DB::transaction(function () { DB::table('users')->update(['votes' => 1]); DB::table('posts')->delete(); });
للمزيد من هنا
لتغيير تنسيق حقول 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'); }