در بسیاری مواقع به ویژه در هنگام تهیهی گزارشها ممکن است لازم شود، تمامی ردیفهای یک یا چند جدول از پایگاه داده پیمایش شوند و برخی محاسبات به وسیلهی کد به انجام برسند.
فریمورک لاراول برای انجام این کار دستور chunk را تعبیه کرده است که ردیفهای جدول را در بستههایی با اندازهی دلخواه واکشی میکند.
این دستور در تعداد ردیفهای نه چندان زیاد قابل استفاده است ولی چنانچه تعداد ردیفها از حدی بیشتر شود، به علت اینکه دستور chunk به ازای هر بسته از ردیفها یک query با استفاده از limit را اجرا میکند، هر چه تعداد بستههای داده بیشتر باشد، سرعت واکشی از پایگاه داده نیز کاهش پیدا میکند و در عمل استفاده از آن غیرقابل توجیه خواهد شد.
نخستین راه حلی که به ذهن میرسد، استفاده از PDO برای دریافت اطلاعات به صورت ردیف به ردیف از پایگاه داده است. این روش نیز به دلیل استفاده نکردن از امکانات بینظیر Fluent و Eloquent خوانایی و توسعهپذیری کد را کاهش میدهد.
خوشبختانه، Eloquent حاوی ابزاری است که کد SQL مربوط به درخواست را ایجاد و برمیگرداند. در نتیجه با استفاده از قطعه کد زیر میتوانیم علاوه بر افزایش کارایی، خوانایی و توسعهپذیری را نیز حفظ کنیم:
<?php $sql = User ::join( 'exam_results', 'exam_results.user_id', '=', 'users.userable_id' ) ->where( 'exam_results.exam_id', 9999 ) // 9999 is a placeholder ->toSql(); $db = DB::connection()->getPdo(); $query = $db->prepare( $sql ); $query->execute( array( $exam->id ) ); // this replaces 9999 while ( $user = $query->fetchObject() ) { var_dump( $user ); } ?> |
تنها نکتهی قابل توجه در قطعه کد بالا این است که به دلیل عدم فراخوانی دستور get، پارامترهای معرفی شده در محل خود قرار نمیگیرند و مقدار دهی پارامترها از جمله پارامترهای where میبایست در مقابل دستور execute به انجام برسد.
منبع: فروم لاراول