🎉 سال نو، مهارت نو، مشاوره رایگان نقشه راه برنامه نویسی (آفر ویژه ثبت نام قبل از افزایش قیمت 🔥)
۰ ثانیه
۰ دقیقه
۰ ساعت
۳ Ali Yz
راهنمایی برای تبدیل کوئری خام به orm
جامعه لاراول ایجاد شده در ۰۶ تیر ۱۴۰۱

با سلام

من کوئری زیر رو به eloquent ORM تبدیل کردم ولی خطا داره و یا خروجی مورد نظرم رو نمیده

$query = "SELECT  users.id,users.name,roles.persian_name AS role_name,roles.food_discount AS discount,sum(reservations.count) AS total_count,sum(foods.price) AS total_price
                    FROM `reservations`,users,foods,roles,fields,programs WHERE
                    reservations.user_id=users.id AND
                    users.role_id=roles.id AND
                    fields.food_id=foods.id AND
                    reservations.field_id=fields.id AND
                    fields.program_id=programs.id AND
                    programs.from_date BETWEEN ? AND ? AND
                    users.building_id=?
                    GROUP BY (users.id)";

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

$data = DB::table('fields')
    ->join('reservations', 'reservations.field_id', '=', 'fields.id')
    ->join('users', 'reservations.user_id', '=', 'users.id')
    ->join('roles', 'users.role_id', '=', 'roles.id')
    ->join('foods', 'fields.food_id', '=', 'foods.id')
    ->join('programs', 'fields.program_id', '=', 'programs.id')
    ->whereBetween('programs.from_date', [$request->from_date, $request->to_date])
    ->where('users.building_id', $request->building_id)
    ->groupBy('users.id')
    ->select(['users.id','users.name','roles.persian_name AS role_name','roles.food_discount AS  discount','reservations.count','foods.price'])
    ->sum('reservations.count')
    ->sum('foods.price')
    ->get();

اما خطا میده

Call to a member function sum() on string

من وقتی این کوئری رو به صورت زیر اجرا میکنم دقیقا درسته و هیچ مشکلی نداره اما pagination نداره

$data = DB::select($query, [$request->from_date, $request->to_date, $request->building_id]);

آیا اینطور کوئری هایی رو اصلا میشه با eloquent پیاده کرد؟؟

با تشکر

میتونید برای اینکه دستتون بازتر باشه بجای select اخرکار از selectRaw استفاده کنید و اونجا همشو داخل تک کوت ' ' بنویسید و خود sum رو هم اونجا استفاده کنید، ببینید اینجوری مشکل تون حل میشه آیا یا نه

امیر ابوئی ۰۶ تیر ۱۴۰۱، ۱۸:۰۹

ممنون از پاسختون بله با select raw درست شد

Ali Yz ۰۷ تیر ۱۴۰۱، ۰۴:۵۳

بعد از متد selectRaw متد paginate رو صدا بزنید و تست بکنید، باید کار بکنه و نباید مشکلی داشته باشه.

البته بعد از متد paginate نیاز نیست متد get رو صدا بزنید چون خود paginate میاد هم عملیات get و pagination رو انجام میده

بهترین پاسخ
امیر ابوئی ۰۷ تیر ۱۴۰۱، ۰۵:۰۰