بإستخدام العلاقة hasMany، نستطيع عمل فلترة للسجلات التي تحتوي على عدد X من الأبناء
// Author -> hasMany(Book::class)
$authors = Author::has('books', '>', 5)->get();
مطوّر ويب وتطبيقات
أكواد قصيرة جاهزة للنسخ واللصق — حيل Laravel واستعلامات Eloquent وأدوات تختصر عليك الوقت في مشروعك القادم.
بإستخدام العلاقة hasMany، نستطيع عمل فلترة للسجلات التي تحتوي على عدد X من الأبناء
// Author -> hasMany(Book::class)
$authors = Author::has('books', '>', 5)->get();
نستطيع عمل ترتيب للبيانات OrderBy مباشرة من خلال العلاقات في الـ model
public function products(){
return $this->hasMany(Product::class);
}
public function productsByName(){
return $this->hasMany(Product::class)->orderBy('name');
}
لتغيير تنسيق حقول 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');
}
اذا كنا نتعامل مع علمية إدخال لجدولين، ربما يحصل خطأ أثناء إدخال البيانات للجدول الثاني، بالتالي يجب عمل تراجع عن البيانات المدخلة للجدول الأول، لذلك ينصح بإستخدام Transactions
DB::transaction(function () {
DB::table('users')->update(['votes' => 1]);
DB::table('posts')->delete();
});للمزيد من هنا
عند عمل إستعلام بإستخدام eloquent إذا كنا نريد إخفاء بعض الحقول من النتائج، ببساطه يمكن إضافة makeHidden
Snippet::all()->makeHidden(['created_at', 'updated_at']);
يفضل إستخدام دوال DB Raw مثل whereRaw لعمل عمليات حسابيه مباشرة في جملة sql حيث تظهر النتائج بشكل أسرع، مثال اذا أردنا جلب المستخدمين الذين قامو بالتسجيل والفعالين خلال 30 يوم
User::where('active', 1)
->whereRaw('TIMESTAMPDIFF(DAY, created_at, updated_at) > ?', 30)
->get();
عند جلب البيانات حسب جدول التاريخ بدلا من إستخدام
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();
بالإضافة إلى findOrFail، يوجد دالة firstOrFail حيث تقوم بإرجاع صفحة 404 اذا لم يكن هناك نتائج للبحث
$user = User::where('email', ccc@ccc.com')->firstOrFail();
بالوضع الإفتراضي يتم البحث في لارافيل بإستخدام 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;
}
عوضا عن إستخدام 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();
اذا كنا نريد الوقت دون الدقائق / الثواني، بالإمكان إستخدام دوال 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();
في ترقيم الصفحات pagination إذا كنا نريد فقط next/previous عوضا عن الأرقام، فقط نستبدل paginate بـ simplePaginate، كما أن هذه الطريقة تخفف حمل على قاعدة البيانات fewer DB queries
// Instead of $users = User::paginate(10); // You can do this $users = User::simplePaginate(10);