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

نوشتن کوئری مناسب برای جداول مرتبط به هم

سلام
من چهار جدول به نام های تمرین، بخش، کتاب و پایه تحصیلی دارم.
جریان اینه که هر تمرین به یک بخشی از کتاب وصله، هر بخش به یک کتاب وصله و هر کتاب به یک پایه تحصیلی مربوط می شه.
برای مثال تمرین حل نمودار وِن از بخش فصل اول از کتاب ریاضی از پایه تحصیلی نهم است.
این وضعیت پایگاه داده. رابطه ها رو هم به درستی تعریف کردم.
حالا من می خوام یک کوئری داشته باشم که تمریناتی که مربوط به یک پایه مشخص هستند رو داشته باشم.
خودم این کوئری رو روی لاراول زدم:

$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);

اما می خوام اگر بشه با استفاده از مدل این کوئری رو پیاده سازی کنم. ممنون می شم اگر راهنمایی بفرمایید.


ثبت پرسش جدید
مهران مرندی
تخصص : برنامه نویس
@mehranmarandi 2 سال پیش آپدیت شد
1

سلام
بر اساس چیزی که توضیح دادید شکل رابطه بین تیبل ها رو به این صورت برداشت کردم:

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


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

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