علیرضا مه آبادی
2 سال پیش توسط علیرضا مه آبادی مطرح شد
17 پاسخ

ارور مربوط به Defer Loading در لایووایر

درود و سلام بر مهندسین گرامی🌹🌷 بنده می خوام از Defer Loading در لایو وایر استفاده کنم و وقتی paginate وجود نداره بدرستی کار می کنه، ولی و قتی paginate هست داخل render این ارور میده هر کاری می کنم نتونستم درستش کنم.!!

Call to a member function links() on array 

این داخل لایووایرم هست.

public $loaded=false;

    public function setLoaded()
    {
        $this->loaded = true;
    }

    public function render()
    {
        $ResultSearch = Product::where('title', 'LIKE', "%{$this->search}%")->paginate(5);
        $products = $this->loaded ? Product::where('kindofproduct', 'dorbin')->paginate(5) : [];
        return view('livewire.product.Product-of-dorbin', ['products' => $products , 'ResultSearch' => $ResultSearch]);
    }

این هم Blade

   <div wire:init="setLoaded" class="row text-center pr-4 " style="width: 100%;">
            @foreach($products as $product)
                <div class="col-sm-12 col-md-6 col-lg-3 pt-2 s">
                    <div class="card border ">
                        <div class="card-header bg-info"><h5>{{$product->title}}</h5></div>
                        <div class="card-body">
                            <p class="pt-2"
                               style="text-align: justify;">{{\Illuminate\Support\Str::limit($product->description,35)}}</p>
                            <div class="card-footer shadow">
                                <a class="btn btn-outline-info" href="/products/{{$product->id}}/{{$product->slug}}">اطلاعات
                                    بیشتر</a>
                            </div>
                        </div>
                    </div>
                </div>
            @endforeach
        </div>

        <div class="card-footer">
            {{$products->links()}}
        </div>
    </div>

ثبت پرسش جدید
فرشید مرادی
تخصص : noob
@eniack 2 سال پیش آپدیت شد
1

کدت رو به این شکل بنویس اوکی میشه

 <div wire:init="setLoaded" class="row text-center pr-4 " style="width: 100%;">
@if($loaded)
            @foreach($products as $product)
                <div class="col-sm-12 col-md-6 col-lg-3 pt-2 s">
                    <div class="card border ">
                        <div class="card-header bg-info"><h5>{{$product->title}}</h5></div>
                        <div class="card-body">
                            <p class="pt-2"
                               style="text-align: justify;">{{\Illuminate\Support\Str::limit($product->description,35)}}</p>
                            <div class="card-footer shadow">
                                <a class="btn btn-outline-info" href="/products/{{$product->id}}/{{$product->slug}}">اطلاعات
                                    بیشتر</a>
                            </div>
                        </div>
                    </div>
                </div>
            @endforeach
        </div>

        <div class="card-footer">
            {{$products->links()}}
        </div>
@endif
    </div>

Sahandi81
تخصص : PHP - Laravel -JS
@sahandi81 2 سال پیش آپدیت شد
1

سلام خسته نباشید.
بعد از پجینیت کردن دیتا مورد نظر میره داخل پراپرتی data
در نتیجه باید کد رو
@foreach($products['data'] as $product)
تغییر بدی.
در هر مرحله با دستور @dd مقدار متغیر هات رو بررسی کن.

برای ارور هم بعد از پجینیت کردن مقدارت از ابجکت به ارایه تغییر میکنه.
برای از دست ندادن پرفورمنس و صدا زدن مجدد الکوئنت بهتره داخل کنترولرت از متد 'with' استفاده کنی.
بدین شکل :

$ResultSearch = Product::with('links')->where('title', 'LIKE', "%{$this->search}%")->paginate(5);

مقدار داخل with اسم متدت داخل مدل Product هستش.
هرچند این کد با هدفی که داری ظاهرا تطابق نداره اما کمکت میکنه.
مشکلی داشتی مجددا، منشن کن


علیرضا مه آبادی
تخصص : در حال یادگیری لاراول
@aliasgharkashani1379 2 سال پیش مطرح شد
0

@sahandi81 ممنون مهندس از راهنماییت راستش یه مقدار گیج شدم الان داخل

 @foreach($products as $product)

چی بزارم یعنی منظورم اون دیتا که فرمودید و اینکه داخل

 $products =$this->loaded ? Product::query()->with('products')->where('kindofproduct', 'dorbin')->orderByDesc('id')->paginate(5) : [];

with بذارم چی داخلش قرار بدم؟؟


Sahandi81
تخصص : PHP - Laravel -JS
@sahandi81 2 سال پیش مطرح شد
0

داخل with اسم متد ریلیشنتون داخل مدل Product.
همون متدی که داخلش روابط hasmany یا hasone رو نوشتین.
به این شکل:

 $products =$this->loaded ? Product::with('links')->where('kindofproduct', 'dorbin')->orderByDesc('id')->paginate(5) : [];

علیرضا مه آبادی
تخصص : در حال یادگیری لاراول
@aliasgharkashani1379 2 سال پیش مطرح شد
0

@sahandi81 مهندس جان من اخه نمی دونم از چه رلیشنی استفاده کنم داخل with اخه لازم نیست من رلیشنی برگردونم من مستقیم دارم از مدل product استفاده می کنم.


میلاد خسروی
تخصص : برنامه نویس بامزه
@milwad 2 سال پیش مطرح شد
0

سلام خسته نباشید
میخواید paginate کنی؟


علیرضا مه آبادی
تخصص : در حال یادگیری لاراول
@aliasgharkashani1379 2 سال پیش مطرح شد
0

@milwad درود بله paginate به همراه Defer Loading لایووایر


میلاد خسروی
تخصص : برنامه نویس بامزه
@milwad 2 سال پیش مطرح شد
فرشید مرادی
تخصص : noob
@eniack 2 سال پیش مطرح شد
0

سلام دیتاهارو به این صورت پاس بده

        return view('livewire.product.Product-of-dorbin',compact('products' , 'ResultSearch'));

علیرضا مه آبادی
تخصص : در حال یادگیری لاراول
@aliasgharkashani1379 2 سال پیش مطرح شد
0

@eniack ممنونم مهندس ولی تفاوتی نکرد.🙏🌸

برای من سواله کسی تاحاله نخواسته از Defer Loading در صفحه بندی استفاده کنه؟


فرشید مرادی
تخصص : noob
@eniack 2 سال پیش آپدیت شد
1

کدت رو به این شکل بنویس اوکی میشه

 <div wire:init="setLoaded" class="row text-center pr-4 " style="width: 100%;">
@if($loaded)
            @foreach($products as $product)
                <div class="col-sm-12 col-md-6 col-lg-3 pt-2 s">
                    <div class="card border ">
                        <div class="card-header bg-info"><h5>{{$product->title}}</h5></div>
                        <div class="card-body">
                            <p class="pt-2"
                               style="text-align: justify;">{{\Illuminate\Support\Str::limit($product->description,35)}}</p>
                            <div class="card-footer shadow">
                                <a class="btn btn-outline-info" href="/products/{{$product->id}}/{{$product->slug}}">اطلاعات
                                    بیشتر</a>
                            </div>
                        </div>
                    </div>
                </div>
            @endforeach
        </div>

        <div class="card-footer">
            {{$products->links()}}
        </div>
@endif
    </div>

علیرضا مه آبادی
تخصص : در حال یادگیری لاراول
@aliasgharkashani1379 2 سال پیش مطرح شد
0

@eniack اقا فرشید خیلی ممنونم اما این کد که شما فرمودید زدم اروری نداد ولی هیچ محصولی رو هم بر نگردوند خالی بود.

این کد داخل لایووایرم هست فکر نمی کنم مشکلی داشته باشه.

class ProductOfDorbin extends Component
{
    use WithPagination;
//*******************************************************************************************
    protected $paginationTheme = 'bootstrap';
    protected $queryString = ['search'];
//********************************************************************************************
    public $categories;
    public $search;
    public $loaded = false;
//-------------------------------------------------------------------------------------------------------------------
    public function mount()
    {
        $this->categories = Category::all();  //دسته بندی ها
    }
//-------------------------------------------------------------------------------------------------------------------
//برای اینکه بتونیم از سرچ در تمام صفحات استفاده کنیم
    public function updatingSearch()
    {
        $this->resetPage();
    }

    public function setLoaded()
    {
        $this->loaded = true;
    }
//-------------------------------------------------------------------------------------------------------------------
    public function render()
    {
        $ResultSearch = Product::where('title', 'LIKE', "%{$this->search}%")->Orwhere('description', 'LIKE', "%{$this->search}%")->Orwhere('price', 'LIKE', "%{$this->search}%")->paginate(1);
        $products =$this->loaded ? Product::query()->where('kindofproduct', 'dorbin')->orderByDesc('id')->paginate(5) : [];
        return view('livewire.product.Product-of-dorbin',compact('products','ResultSearch'));
    }
}

فرشید مرادی
تخصص : noob
@eniack 2 سال پیش مطرح شد
0

منم مشکلی داخل کدها نمیبینم ، لطفا یکبار query رو به این شکل بنویس

 $products =$this->loaded ?Product::latest()->paginate(3) : [] ;

علیرضا مه آبادی
تخصص : در حال یادگیری لاراول
@aliasgharkashani1379 2 سال پیش مطرح شد
0

@eniack تفاوتی نکرد 🙏🌼


فرشید مرادی
تخصص : noob
@eniack 2 سال پیش مطرح شد
0

یه dd از متغیر $products بگیرید ببینید محصولی داخلش هست


علیرضا مه آبادی
تخصص : در حال یادگیری لاراول
@aliasgharkashani1379 2 سال پیش مطرح شد
0

@eniack مهندس وقتی اینو dd می گیرم 3 تا محصول مورد نظر در دیتا بیس نشون میده.

 $products =Product::query()->where('kindofproduct', 'dorbin')->orderByDesc('id')->paginate(5) ;

ولی وقتی این رو dd می گیرم یک ارایه خالی بر میگردونه

$products =$this->loaded ? Product::query()->where('kindofproduct', 'dorbin')->orderByDesc('id')->paginate(5) : [];

فرشید مرادی
تخصص : noob
@eniack 2 سال پیش مطرح شد
0

خب درسته چون متغیر loaded برابر false هستش وقتی متد setLoaded اجرا میشه محصول داخلش قرار میگیره ،
تب network رو باز کنید ببینید اروری وجود داره؟


علیرضا مه آبادی
تخصص : در حال یادگیری لاراول
@aliasgharkashani1379 2 سال پیش مطرح شد
1

@eniack مهندس عزیز خیلی لطف کردی دقیقا همون پاسخی که انتخاب کردم جواب بود فقط من wire:init بد جایی گذاشته بودم
خیلی ممنونم از وقتی که گذاشتید سلامت و پایدار باشید😍😍😍😍😍😍😍🙏🙏🙏🌺🌺🌺🌺🌺


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام