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