در بسیاری از مواقع، به ویژه هنگام تهیه گزارشها، ممکن است نیاز باشد که تمامی ردیفهای یک یا چند جدول از پایگاه داده پیمایش شوند و برخی محاسبات از طریق کد انجام گیرند. فریمورک لاراول برای این منظور دستور 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 به انجام برسد.
منبع: فروم لاراول