فرض کنید شما یک محصول را دارید در سایت خود می فروشید و می خواهید لیست کاربرانی را که توسط مهدی مهدوی معرفی شده اند بدست آورید.همینطور تعداد دفعاتی که هر کدام از آنها سفارش داده اند. احتمالا کاربرانی هم خواهند بود که توسط مهدی مهدوی به سایت ما آمده اند ولی هنوز سفارش شان را تکمیل نکرده اند پس نیاز داریم لیست آنها را نیز با Left Join
بدست آوریم.
در نهایت شما می خواهید ID،نام و تعداد سفارشات کاربران را بدست آورید. برای این کار از دو جدولی که از قبل داریم استفاده می کنیم . یعنی users
و orders
.
فرض کنید جدول order یا سفارشات شامل فیلدهای id , user_id
(می تواند فیلد قیمت کل سفارش نیز باشد و ..) هست و جدول دیگر یعنی users شامل فیلدهای id, name, referrer_id
است.
با سه روش می توانیم به خواسته خود برسیم .
روش SQL خام
id یکتای مهدی مهدوی همان $referrer_id
است
$sql = "SELECT users.id , users.name, orders.num_orders FROM users LEFT JOIN ( SELECT user_id, count( * ) AS num_orders FROM orders GROUP BY user_id ) orders ON orders.user_id = users.id WHERE referrer_id = '{$referrer_id}'"; // Now run the query
روش استفاده از Eloquent در Laravel 5
هنگام استفاده از DB::raw()
مراقب حمله های Sql Injection باشید.
$temptable = DB::raw("(SELECT user_id, count(*) AS num_orders FROM orders GROUP BY user_id) as orders"); return DB::table('users') ->select('users.id','users.name', 'orders.num_orders') ->leftJoin($temptable, 'orders.user_id', '=', 'users.id') ->where('referrer_id', '=', $referrer_id) ->get();
خروجی
خروجی احتمالی این چنین خواهد بود
array (size=5) ۰ => object(stdClass)[187] public 'id' => string '16' (length=2) public 'name' => string 'Stoltenberg, Sanford And Pfeffer' (length=32) public 'num_collections' => string '1' (length=1) ۱ => object(stdClass)[186] public 'id' => string '20' (length=2) public 'name' => string 'Ebert, Daugherty And Mann' (length=25) public 'num_orders' => string '2' (length=1) ۲ => object(stdClass)[185] public 'id' => string '23' (length=2) public 'name' => string 'Daugherty LLC' (length=13) public 'num_orders' => string '1' (length=1) ۳ => object(stdClass)[195] public 'id' => string '24' (length=2) public 'name' => string 'Reilly-Greenfelder' (length=20) public 'num_orders' => null ۴ => object(stdClass)[196] public 'id' => string '27' (length=2) public 'name' => string 'Breitenberg-Wilkinson' (length=21) public 'num_orders' => null