سلام
من چهار جدول به نام های تمرین، بخش، کتاب و پایه تحصیلی دارم.
جریان اینه که هر تمرین به یک بخشی از کتاب وصله، هر بخش به یک کتاب وصله و هر کتاب به یک پایه تحصیلی مربوط می شه.
برای مثال تمرین حل نمودار وِن از بخش فصل اول از کتاب ریاضی از پایه تحصیلی نهم است.
این وضعیت پایگاه داده. رابطه ها رو هم به درستی تعریف کردم.
حالا من می خوام یک کوئری داشته باشم که تمریناتی که مربوط به یک پایه مشخص هستند رو داشته باشم.
خودم این کوئری رو روی لاراول زدم:
$grade = 9; //Example
$practice = DB::table('practices')
->select('practices.id')
->where('teacher_id','=',$teacher->id)
->where('code','=',$practiceCode)
->join('sections','practices.section_id','=','sections.id')
->join('books','sections.book_id','=','books.id')
->where('books.grade_id','=',$grade)
->first();
اما با این کوئری شی دریافت نمی کنم و مجبورم وقتی می خوام این رو به blade ارسال کنم تبدیل به شی کنمش. اینطوری این کار رو انجام دادم.
$practice_id = $practice->id ;
$practiceObject = Practice::find($practice_id);
اما می خوام اگر بشه با استفاده از مدل این کوئری رو پیاده سازی کنم. ممنون می شم اگر راهنمایی بفرمایید.
سلام
بر اساس چیزی که توضیح دادید شکل رابطه بین تیبل ها رو به این صورت برداشت کردم:
books->sections->practices
من به شخصه تو اینجور مواقع کوئری رو از تیبل بالادستی شروع میکنم، کوئری که خودتون نوشتید رو شاید بشه به این شکل هم نوشت:
$grade = 9; //Example
$practices = DB::table('books')
->join('sections','sections.book_id','=','books.id')
->join('practices','practices.section_id','=','sections.id')
->select('practices.*')
->where('practices.teacher_id','=',$teacher->id)
->where('practices.code','=',$practiceCode)
->where('books.grade_id','=',$grade)
->get();
و برای این که بتونید از الکوئنت مدل استفاده کنید باید ابتدا رابطه بین جدول ها رو در مدل تعریف کنید.
برای مثال اگر جدول های شما این فیلد ها رو داشته باشه:
books
id - integer
sections
id - integer
book_id - integer
practices
id - integer
section_id - integer
میتونید در مدل Book یک رابطه HasManyThrough تعریف کنید، حدودا چیزی شبیه به این:
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasManyThrough;
class Book extends Model
{
/**
* Get all of the practices for the book.
*/
public function practices(): HasManyThrough
{
return $this->hasManyThrough(Practice::class, Section::class);
}
}
و حالا هر وقت بخوایید تمرین های مربوط به یک کتاب رو بگیرید میشه این رابطه رو صدا بزنید:
$practices = Book::with('practices');
منبع:https://laravel.com/docs/10.x/eloquent-relationships#has-many-through
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟