Header Ads

Header ADS

Laravel whereHas and When for eloquent relations

 

🔹 ১. whereHas() কী?

👉 whereHas() use করা হয় যখন একটা model এর সাথে আরেকটা model এর relationship থাকে এবং তুমি চাইছো সেই relation এর ডাটা চেক করে মূল model filter করতে।

ধরা যাক,

  • একটা Product আছে,

  • প্রতিটা Product এর একটা Category আছে (relationship: product belongsTo category).

এখন যদি তুমি শুধু সেই Product গুলো নিতে চাও যেগুলোর Category এর নাম "Electronics", তখন সরাসরি Product থেকে filter করা যাবে না।
কারণ category তো আলাদা টেবিলে আছে।
তখনই whereHas() কাজে লাগে।

Product::whereHas('category', function($q) { $q->where('name', 'Electronics'); })->get();

📌 এখানে:

  • whereHas('category') মানে — Product গুলোর মধ্যে শুধুমাত্র সেই গুলো আনো যেগুলোর সাথে category আছে।

  • ভিতরের closure তে condition দিয়ে দিলাম category.name = Electronics.


🔹 ২. when() কী?

👉 when() হলো conditional query builder. মানে:
“শুধু তখনই এই query চালাও যদি condition true হয়।”

যেমন, user যদি URL এ ?price_min=100 দেয়, তখনই query তে where price >= 100 যোগ হবে।
না দিলে ওই condition থাকবে না।

Product::when($request->price_min, function($q) use ($request) { $q->where('price', '>=', $request->price_min); })->get();

📌 কাজটা if/else দিয়ে করা যেতো, কিন্তু when() দিয়ে কোড clean আর readable হয়।


🔹 ৩. কেন দরকার?

✅ যদি relation না লাগে → whereHas() দরকার নেই।
✅ যদি optional filter দরকার না হয় → when() দরকার নেই।

কিন্তু complex project এ একসাথে দুটোই দরকার হয়


🔹 ৫টা Real-life Example ব্যাখ্যা সহ


🛒 (১) E-commerce Website

Scenario:
তুমি চাইছো "Electronics" category এর product গুলো দেখাতে, আর optional ভাবে user price range দিলে সেটা apply হবে।

public function index(Request $request) { $products = Product::whereHas('category', function($q) { $q->where('name', 'Electronics'); // relation condition }) ->when($request->price_min, function($q) use ($request) { $q->where('price', '>=', $request->price_min); // optional filter }) ->when($request->price_max, function($q) use ($request) { $q->where('price', '<=', $request->price_max); }) ->get(); }

Output:

  • User কিছু না দিলে শুধু electronics আসবে।

  • User যদি ?price_min=500 দেয়, তাহলে 500 টাকার বেশি electronics আসবে।


🎓 (২) Online Course / LMS

Scenario:
Course table আছে, আর প্রত্যেক Course এর multiple Lesson আছে।
তুমি শুধু সেই course show করতে চাও যেগুলোর অন্তত ৫টা lesson আছে।

$courses = Course::whereHas('lessons', function($q) { $q->whereNotNull('id'); }, '>=', 5) ->when($request->difficulty, function($q) use ($request) { $q->where('difficulty', $request->difficulty); }) ->get();

Output:

  • Minimum ৫টা lesson যেসব course এ আছে।

  • User যদি beginner filter দেয়, তাহলে শুধুই beginner course আসবে।


🏥 (৩) Hospital Management System

Scenario:
Doctor table আছে। Doctor এর appointment relation আছে।
তুমি শুধু সেই Doctor show করবে যাদের future appointment আছে।

$doctors = Doctor::whereHas('appointments', function($q) { $q->where('date', '>=', now()); // শুধু future appointment }) ->when($request->speciality, function($q) use ($request) { $q->where('speciality', $request->speciality); // optional filter }) ->get();

Output:

  • শুধু সেই ডাক্তাররা আসবে যাদের future appointment আছে।

  • সাথে speciality দিলে শুধু সেই ডাক্তার আসবে।


🏠 (৪) Real Estate Website

Scenario:
Property table আছে, আর প্রতিটা property এর multiple feature আছে।
তুমি শুধু সেই property আনবে যেগুলোর মধ্যে “garage” feature আছে।

$properties = Property::whereHas('features', function($q) { $q->where('name', 'garage'); // relation filter }) ->when($request->city, function($q) use ($request) { $q->where('city', $request->city); // optional filter }) ->get();

🛍️ (৫) Multi-vendor Marketplace

Scenario:
Vendor আছে, আর Vendor এর product relation আছে।
তুমি চাইছো শুধু সেই vendor show করতে যাদের অন্তত ১০টা product আছে।

$vendors = Vendor::whereHas('products', function($q) { $q->whereNotNull('id'); }, '>=', 10) ->when($request->verified, function($q) use ($request) { $q->where('is_verified', true); }) ->get();

No comments

Theme images by fpm. Powered by Blogger.