ronald
4 سال پیش توسط ronald مطرح شد
13 پاسخ

دیتای زیاد در دیتابیس

سلام دوستان من تعداد داده های یکی از جداولم خیلی زیاد شده به همین دلیل سرعت واکشی داده هام خیلی کمه
دوستانی chunk رو برای این کار پیشنهاد کردن
اما این تابع مقدر true برمیگردونه و داده هام رو نمیده .
دوستان اگر ممکنه یک نمونه برا گرفتن داده با استفاده از تابع chunk رو قرار بدن ممنونشون میشم .


ثبت پرسش جدید
پارسا
تخصص : برنامه نویس PHP-Laravel، طراح...
@parsavdst 4 سال پیش مطرح شد
0

فیلد هایی ک روی اونها دارید کوئری میزنید رو ایندکس کنید مشکل حل میشه.این روش واسع رکوردهای بالا (البته نه در حد میلیون) جواب میده 👍


علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 4 سال پیش مطرح شد
0

به شکل زیر میتونی از chunk استفاده کنی:

DB::table('users')->chunk(100, function($users)
{
    foreach ($users as $user)
    {
        //
    }
});

از طریق الکوئنت هم میتونی ازش استفاده کنی


ronald
@crireal5 4 سال پیش مطرح شد
0

@ali.bayat
گر بخواهیم با این دستوری که ارسال کردین همه کاربران رو با یه شرطی مثلا اگر is_enable==۱ برگردونیم چیکار باید بکنیم ؟


علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 4 سال پیش مطرح شد
0
DB::table('users')->where('is_enable', 1)->chunk(100, function($users)
{
    foreach ($users as $user)
    {
        //
    }
});

ronald
@crireal5 4 سال پیش مطرح شد
0

@ali.bayat
خب من از این دستور استفاده کردم اما کالکشنی از کاربران رو نمیده بلکه مقدار true برمیگردونه


علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 4 سال پیش مطرح شد
0

احتمالا باید متد get رو به انتهای کوئری اضافه کنی


ronald
@crireal5 4 سال پیش مطرح شد
0

@ali.bayat
نه متاسفانه باز هم کالکشن برنمیگردونه


علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 4 سال پیش مطرح شد
0

کدتون رو قرار بدید


ronald
@crireal5 4 سال پیش مطرح شد
0

@ali.bayat


Route::get('/all', function () {
    return \DB::table('users')->where('is_enable',1)->chunk(100, function($users)
    {
        foreach ($users as $user)
        {
            //
        }
    })->get();
});

ronald
@crireal5 4 سال پیش مطرح شد
0

@ali.bayat
البته کد بالا خطا میده .

You must specify an orderBy clause when using this function.

علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 4 سال پیش آپدیت شد
0

ببینید وقتی ما از get استفاده میکنیم .. اون موقع هست که کالکشن برای ما بر میگرده و سپس میتونیم با chunk نتایج رو بخش بخش کنیم.

پس کدت باید شبیه زیر باشه:

DB::table('users')
    ->get()
    ->chunk(2, function($users){ 
        foreach ($users as $userSet) { 
            var_dump($userSet); 
        } 
    });

ronald
@crireal5 4 سال پیش مطرح شد
0

@ali.bayat
درست میفرمایین اما من میخواستم این chunk داخل دیتا بیس اتفاق بیفته چون تعداد رکورد ها زیاد هستن زمان زیادی طول میکشه داده هام و بگیرم .
پیشنهادی که کرده بودن این بود که کوئری هر چقد به تعداد کوچکتر تقسیم بشه سرعت واکشی بالا میره و این کار با chunk امکان پذیر هست .


علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 4 سال پیش مطرح شد
0

chunk رو باید روی یه Collection استفاده کرد..
نه روی Instance کلاس QueryBuilder


اما برای کاری که شما می‌خواهی انجام بدی
میشه از limit و یا take استفاده کرد.
مثلا:

User::where(...)->take(100);

چنین کوئری میسازه:

select * from users where ... LIMIT 100;

همچنین میتونی از Lazy Collection ها هم (ار نسخه ۶ و ۶ به بعد لاراول) استفاده کنی.


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

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