سلام
من یک جدولی دارم شامل تمرینات. هر تمرین به یک دوره مربوطه که رابطه اش تعریف شده. هر دوره با یک پایه ارتباط داره که رابطه اون هم نوشته شده. (توی جدول تمرینات فیلد پایه وجود نداره)
حالا می خوام یک کوئری بزنم که مثلا تمریناتی رو به من بده که پایه اشان عدد 2 است. (عدد 2 مثال است)
تو تصویر هم جدول ها رو مشخص کردم.
ممنون می شم کمکم کنید کوئری مربوطه رو بنویسم
کمی مستندات لاراول رو بررسی کردم. ظاهرا دستور مشخصی برای اجرای کوئری روی روابط داره به نام wherehas
خوشبختانه با اون دستور تونستم کارم رو راه بندازم.
$practice = Practice::query()
->where('teacher_id','=',$teacher->id)
->whereHas('course', function ($query) use ($grade) {
$query->where('grade_id', '=', $grade);
})->first();
کدم شد این.
فعلا که کار می کنه. البته کدم قراره توسعه پیدا کنه. امیدوارم برای حالت های پیشرفته تر هم جواب بده.
@wozniak از بابت وقتی که شما گذاشتید تشکر می کنم.
سلام
ممنون از وقتی که گذاشتید.
ولی من Course ها رو نمی خوام. بلکه practice هایی رو می خوام که grade_id اونها برابر 2 باشه
سلام
اگر از query builder استفاده می کنید باید خودتون join بزنید:
DB::table("practices")->leftJoin("cources", "cource_id", "cources.id")->where("grade_id", 2)->get()
@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
بله اون حالتی که شما میخواهید استفاده از eloquent هستش ، فکر میکنم اگر به صورت زیر عمل کنید مشکلتون حل خواهد شد :
Practice::with("cources")->where("grade_id", 2)->get()
البته باید توجه داشته باشید که در این حالت نیاز به تعریف relation در بین مدل های Practice , Cource دارید
با سلام مجدد و تبریک شب یلدا
@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
میتونید از whereRaw استفاده کنید به صورت زیر
whereRaw("cources.grade_id = 2")
البته یه موردی اضافه بکنم به جواب دو پیام قبل شما ، یعنی این قسمت :
آیا می شه روی این قالب اصلاحاتی انجام بشه و یا اینکه روی query builder تغییراتی بدیم که خروجی به صورت مدل باشه تا من بتونم ا ز روابط تعریف شده روی مدل هم بهره ببرم. الان با کوئری شما وقتی می خوام از خروجی تولید شده $practice->section->book رو بگیرم خطا می ده که : Undefined property: stdClass::$section
اینکه شما میتونید در query builder چندین جون باهم بزنید : مثلا روی تیبل section هم جوین بزنید و تعداد جوین ها بیشتر میشه و در واقع به وسیله ی query builder اون کوری که مد نظرتون هست رو بسازید و خروجی مورد نظرتون رو بگیرید.
کمی مستندات لاراول رو بررسی کردم. ظاهرا دستور مشخصی برای اجرای کوئری روی روابط داره به نام wherehas
خوشبختانه با اون دستور تونستم کارم رو راه بندازم.
$practice = Practice::query()
->where('teacher_id','=',$teacher->id)
->whereHas('course', function ($query) use ($grade) {
$query->where('grade_id', '=', $grade);
})->first();
کدم شد این.
فعلا که کار می کنه. البته کدم قراره توسعه پیدا کنه. امیدوارم برای حالت های پیشرفته تر هم جواب بده.
@wozniak از بابت وقتی که شما گذاشتید تشکر می کنم.
یک دستور هست با عنوان ->whereRelation که شرط رو مستقیم درون ریلیشن چک میکنه پیشنهاد میکنم ریلیشن تون رو از طریق Eloquent تعریف کنید بعد خیلی راحت جدول پایه رو فراخوانی کنید ریلیشن تون رو with کنید و شرط تون رو whereRelation کنید .
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟