Bad Practice Example
class Transaction extends Model { public function category() { return $this->belongsTo(Category::class); } } class Category extends Model { public function project() { return $this->belongsTo(Project::class); } } class TransactionController extends Controller { public function index() { $transactions = Transaction::whereHas('category', function ($q) { $q->where('project_id', 1); })->get(); }
What To Do Instead
class Transaction extends Model { public function category() { return $this->belongsTo(Category::class); } } class Category extends Model { public function project() { return $this->belongsTo(Project::class); } } class TransactionController extends Controller { public function index() { $transactions = Transaction::select('trasnactions.*') ->join('categories', 'transactions.category_id', '=', 'categories.id') ->where('categories.project_id', 1) ->get(); }
اذا كان لديك مئات السجلات في قاعدة البيانات وتهتم بالأداء، يفضل إستخدام join عوضاً عن إستخدام whereHas.
الحيان
حاليا لدي استعلامات قاعدة البيانات مع ثلاث علاقات استخدم join لكن الاداء جد ضعيف وقت تنفيذ الاستعلام يزيد عن 10 ثواني علما ان الاستعلامات تضم aggravate functions