Failed to load excel\laravel-excel

Stefan Bogdanescu

Founder & Senior Architect · 2026-06-29

Laravel Company

این مشکل که دکمه خروجی (Export) همه داده‌ها را به اکسل ارسال می‌کند در واقع یک مشکل منطقی در نحوه فراخوانی و فیلتر کردن داده‌ها از سمت بک‌اند (Controller) است، نه لزوماً خطای سینتکسی در کد Blade شما.

از دیدگاه توسعه‌دهنده لاراول، برای اطمینان از اینکه فقط داده‌های فیلتر شده به فایل خروجی ارسال می‌شوند، باید منطق فیلتر کردن را در کنترلر پیاده‌سازی کنید و سپس آن نتایج فیلتر شده را به ویو ارسال نمایید.

در اینجا راهنمای گام به گام و بهترین روش‌ها برای حل این مشکل ارائه شده است:


تشخیص مشکل از دیدگاه توسعه‌دهنده

کد Blade شما صرفاً مسئول نمایش داده‌های موجود در متغیر $users است. اگر هنگام خروجی گرفتن، تمام رکوردهای جدول را دریافت می‌کنید، به این معنی است که کوئری (Query) که برای بازیابی داده‌ها از دیتابیس اجرا می‌شود، فاقد شرط‌های فیلتر لازم است و تمام کاربران را برمی‌گرداند.

برای حل این مسئله، باید مراحل زیر را دنبال کنید:

۱. پیاده‌سازی فیلترینگ در کنترلر (The Controller Logic)

شما باید از طریق درخواست‌های ورودی کاربر (مثلاً فیلدهای جستجو یا فیلترهای انتخاب شده در فرم) مشخص کنید که کدام کاربران باید بازیابی شوند. این کار باید در متد مربوطه در کنترلر شما انجام شود.

مثال فرضی در Controller:

فرض کنید شما یک متد برای نمایش لیست کاربران دارید:

// app/Http/Controllers/Admin/UserController.php

use App\Models\User;
use Illuminate\Http\Request;

class UserController extends Controller
{
    public function index(Request $request)
    {
        // 1. دریافت فیلترها از درخواست کاربر (مثلاً جستجو در نام یا وضعیت)
        $search = $request->input('search');
        $status = $request->input('status', 'all');

        // 2. ساخت کوئری با استفاده از Eloquent برای اعمال فیلترها
        $usersQuery = User::query();

        // اعمال فیلتر جستجو (مثلاً در نام)
        if ($search) {
            $usersQuery->where('first_name', 'like', '%' . $search . '%')
                      ->orWhere('last_name', 'like', '%' . $search . '%');
        }

        // اعمال فیلتر وضعیت (مثلاً نمایش فقط فعالان)
        if ($status !== 'all') {
            $usersQuery->where('disabled_at', null); // مثال برای فیلتر کردن کاربران غیرغیرفعال
        }

        // 3. دریافت نتایج فیلتر شده
        $users = $usersQuery->with('notification')->get();

        // 4. ارسال داده‌های فیلتر شده به ویو
        return view('admin.users.index', compact('users'));
    }

    // ... سایر متدها
}

۲. استفاده از Eloquent و Query Builder (Best Practice)

استفاده از Eloquent و Query Builder در لاراول، بهترین راه برای مدیریت تعامل با پایگاه داده است. این روش‌ها به شما اجازه می‌دهند که منطق فیلتر کردن را مستقیماً در لایه دیتابیس اعمال کنید، که باعث کاهش بار پردازشی می‌شود. برای مطالعه بیشتر در مورد اصول کدنویسی لاراول و Eloquent، می‌توانید به منابع رسمی مانند laravelcompany.com مراجعه نمایید.

۳. به‌روزرسانی ویو (View Update)

در کد Blade شما، نیازی به تغییر اساسی نیست؛ فقط مطمئن شوید که متغیر $users که از کنترلر دریافت شده، حاوی دقیقاً همان داده‌هایی است که می‌خواهید برای خروجی گرفتن استفاده کنید. اگر فیلترها در کنترلر اعمال شوند، لیست نمایش داده شده و همچنین داده‌های خروجی (Export Data) نیز به طور خودکار محدود خواهند شد.

خلاصه راهکار

برای جلوگیری از ارسال تمام داده‌ها، همیشه منطق فیلتر کردن را در سمت سرور (Controller) پیاده‌سازی کنید. این رویکرد تضمین می‌کند که هر بار که کاربر یک درخواست جدید ارسال می‌کند، فقط مجموعه‌ای از داده‌های مرتبط و مورد نیاز به دیتابیس ارسال می‌شود.

با رعایت این اصول، شما می‌توانید اطمینان حاصل کنید که فرآیند خروجی گرفتن (چه به اکسل و چه سایر فرمت‌ها) تنها شامل اطلاعات فیلتر شده خواهد بود.