رافق مجتهدزاده
2 سال پیش توسط رافق مجتهدزاده مطرح شد
9 پاسخ

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

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


ثبت پرسش جدید
رافق مجتهدزاده
تخصص : برنامه نویسی php
@rafig 2 سال پیش مطرح شد
1

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

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

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


رضا جهانگیر
تخصص : Full-Stack Developer
@rezajahangir 2 سال پیش مطرح شد
1

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

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

موفق باشید.


رافق مجتهدزاده
تخصص : برنامه نویسی php
@rafig 2 سال پیش آپدیت شد
0

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


woz
تخصص : fan of open source world
@wozniak 2 سال پیش آپدیت شد
1

سلام

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

DB::table("practices")->leftJoin("cources", "cource_id", "cources.id")->where("grade_id", 2)->get()

رافق مجتهدزاده
تخصص : برنامه نویسی php
@rafig 2 سال پیش مطرح شد
0

@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
تخصص : fan of open source world
@wozniak 2 سال پیش آپدیت شد
1

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

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

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


رافق مجتهدزاده
تخصص : برنامه نویسی php
@rafig 2 سال پیش مطرح شد
0

با سلام مجدد و تبریک شب یلدا
@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
تخصص : fan of open source world
@wozniak 2 سال پیش آپدیت شد
1

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

whereRaw("cources.grade_id = 2")

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

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

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


رافق مجتهدزاده
تخصص : برنامه نویسی php
@rafig 2 سال پیش مطرح شد
1

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

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

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


حسین افتخارراد
تخصص : نال کد
@hosseinradvictor 2 سال پیش مطرح شد
1

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


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

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