راکت
حل شده

نوشتن کوئری با لاراول

9 پاسخ

سلام
من یک جدولی دارم شامل تمرینات. هر تمرین به یک دوره مربوطه که رابطه اش تعریف شده. هر دوره با یک پایه ارتباط داره که رابطه اون هم نوشته شده. (توی جدول تمرینات فیلد پایه وجود نداره)
حالا می خوام یک کوئری بزنم که مثلا تمریناتی رو به من بده که پایه اشان عدد 2 است. (عدد 2 مثال است)
تو تصویر هم جدول ها رو مشخص کردم.
ممنون می شم کمکم کنید کوئری مربوطه رو بنویسم
 تصویر

ثبت پرسش جدید

پاسخ‌ها

9
رافق مجتهدزاده
رافق مجتهدزاده
@rafig

تخصص: برنامه نویسی php

بهترین پاسخ

کمی مستندات لاراول رو بررسی کردم. ظاهرا دستور مشخصی برای اجرای کوئری روی روابط داره به نام wherehas
خوشبختانه با اون دستور تونستم کارم رو راه بندازم.

$practice = Practice::query()
            ->where('teacher_id','=',$teacher->id)
            ->whereHas('course', function ($query) use ($grade) {
            $query->where('grade_id', '=', $grade);
        })->first();

کدم شد این.
فعلا که کار می کنه. البته کدم قراره توسعه پیدا کنه. امیدوارم برای حالت های پیشرفته تر هم جواب بده.
@wozniak از بابت وقتی که شما گذاشتید تشکر می کنم.

رضا جهانگیر
رضا جهانگیر
@rezajahangir

تخصص: Full-Stack Developer

سلام به شما دوست عزیز.

Course::where('grade_id', 2)->get();

موفق باشید.

رافق مجتهدزاده
رافق مجتهدزاده
@rafig

تخصص: برنامه نویسی php

سلام
ممنون از وقتی که گذاشتید.
ولی من Course ها رو نمی خوام. بلکه practice هایی رو می خوام که grade_id اونها برابر 2 باشه

شاید پاسخ شما همین‌جا باشد

woz
woz
@wozniak

تخصص: fan of open source world

سلام

اگر از query builder استفاده می کنید باید خودتون join بزنید:

DB::table("practices")->leftJoin("cources", "cource_id", "cources.id")->where("grade_id", 2)->get()
رافق مجتهدزاده
رافق مجتهدزاده
@rafig

تخصص: برنامه نویسی php

@wozniak ممنون از بابت راهنماییتون.
با query builder اطلاعات به درستی خونده می شه . منتها چون خروجی به صورت مدلی از practice ارسال نمی شه نمیتونم از روابط تعریف شده در داخل مدل -که استفاده ازش برام ضروری هستش- استفاده کنم.
سعی کردم با استفاده از مدل همین فراخوانی رو انجام بدم با دستور زیر که ظاهرا leftJoin در این نوع کوئری شناخته نمی شه و خطا می ده.
دستور:

$practice = Practice::query()->where('code','=',$practiceCode)
            >leftJoin('courses','course_id','courses.id')->where('grade_id','=',$grade)
           ->where('teacher_id','=',$teacher->id)->first();

(سطر دوم مد نظر است)
آیا می شه روی این قالب اصلاحاتی انجام بشه و یا اینکه روی query builder تغییراتی بدیم که خروجی به صورت مدل باشه تا من بتونم ا ز روابط تعریف شده روی مدل هم بهره ببرم. الان با کوئری شما وقتی می خوام از خروجی تولید شده $practice->section->book رو بگیرم خطا می ده که : Undefined property: stdClass::$section

woz
woz
@wozniak

تخصص: fan of open source world

بله اون حالتی که شما میخواهید استفاده از eloquent هستش ، فکر میکنم اگر به صورت زیر عمل کنید مشکلتون حل خواهد شد :

Practice::with("cources")->where("grade_id", 2)->get()

البته باید توجه داشته باشید که در این حالت نیاز به تعریف relation در بین مدل های Practice , Cource دارید

رافق مجتهدزاده
رافق مجتهدزاده
@rafig

تخصص: برنامه نویسی php

با سلام مجدد و تبریک شب یلدا
@wozniak
متاسفانه با دستور بالا نتونستم where رو اجرا کنم. البته رابطه تعریف شده و با دستور

$practice = Practice::with("course")
            ->get();
        dd($practice);

تونستم مقادیر رابطه رو و فیلدی که می خوام روش شرط باشه رو تو خروجی ببینم. تصویرش رو خدمتتون ضمیمه کردم.
 تصویر
منتها وقتی دستور کاملی که شما فرستادید رو می زنم where اجرا نمی شه و خطا می ده:
متن کد کامل شما:

$practice = Practice::with("course")->where('grade_id','=',$grade)
            ->get();
        dd($practice);

خطا:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'grade_id' in 'where clause'

select * from `practices` where `grade_id` = 9
woz
woz
@wozniak

تخصص: fan of open source world

میتونید از whereRaw استفاده کنید به صورت زیر

whereRaw("cources.grade_id = 2")

البته یه موردی اضافه بکنم به جواب دو پیام قبل شما ، یعنی این قسمت :

آیا می شه روی این قالب اصلاحاتی انجام بشه و یا اینکه روی query builder تغییراتی بدیم که خروجی به صورت مدل باشه تا من بتونم ا ز روابط تعریف شده روی مدل هم بهره ببرم. الان با کوئری شما وقتی می خوام از خروجی تولید شده $practice->section->book رو بگیرم خطا می ده که : Undefined property: stdClass::$section

اینکه شما میتونید در query builder چندین جون باهم بزنید : مثلا روی تیبل section هم جوین بزنید و تعداد جوین ها بیشتر میشه و در واقع به وسیله ی query builder اون کوری که مد نظرتون هست رو بسازید و خروجی مورد نظرتون رو بگیرید.

حسین افتخارراد
حسین افتخارراد
@hosseinradvictor

تخصص: نال کد

یک دستور هست با عنوان ->whereRelation که شرط رو مستقیم درون ریلیشن چک میکنه پیشنهاد میکنم ریلیشن تون رو از طریق Eloquent تعریف کنید بعد خیلی راحت جدول پایه رو فراخوانی کنید ریلیشن تون رو with کنید و شرط تون رو whereRelation کنید .

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

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