Eloquent ORM و Query Builder در لاراول

لاراول دو رویکرد را برای کار با دیتابیس به شما پیشنهاد می دهد:

Eloquent ORM: یک ORM بر پایه active record به شما می‌دهد و یک interface با ظرفیت های رابطه ای خودساخته فراهم می کند.

Query Builder: یک رویکرد قابل انعطاف، به علاوه آشنا برای ایجاد کوئری‌های SQL می دهد. و یک رویکرد طبیعی برای ایجاد کوئری های SQL در مورد بخش بزرگی از سازگاری استفاده از SQL مستقیم می دهد.

بخش زیادی از مقالات و ویدیوهایی که من برای پیشرفت در لاراول خوندم، روی استفاده از Eloquent برای دسترسی به دیتابیس متمرکز شده است. از طرفی، فهمیدم که استفاده از Eloquent برای ساخت JSON حداقل برای برخی تسکها، مانع کنترل من روی چگونگی تنظیم و تولید JSON است. این مقاله نشان می دهد که چگونه من به Query Builder متوسل شدم تا مجموعه های نتایج را به عنوان JSON معرفی کنم.

همانطور که به مطالعه لاروال ادامه می دهم، خیلی هم مطمئن هستم که مسئولیت هایی که برای Eloquent وجود دارد، بسیار مناسب است. با وجود این، متوجه شدم که وظایفی هم که برای Query Builder بسیار مناسب است، وجود دارد.

استفاده از Eloquent ORM

این هم از کد Eloquent (که انتظار می رود روابط لاراول در آن ساخته شده باشد).

$tasks = Project::with( ['category', 'state', 'type'] )->
    where('status_id', '<>', 3)->
    orderBy('description')->
    orderBy('id', 'desc')->get(['projects.id',
       'projects.type_id',
       'projects.status_id',
       'projects.category_id',
       'projects.description',
       'projects.start_time']);
return $projects;

که JSON زیر را تولید می کند:

[
    {
        id: "2",
        type_id: "2",
        status_id: "1",
        category_id: "1",
        description: "Dr Fahad Qureshi",
        start_time: "2013-08-04 16:00:00",
        category: {
            id: "1",
            text: "Personal",
            created_at: "2013-07-17 04:47:37",
            updated_at: "2013-07-17 04:47:37"
        },
        state: {
            id: "1",
            text: "Open",
            created_at: "2013-07-17 04:47:37",
            updated_at: "2013-07-17 04:47:37"
        },
        type: {
            id: "2",
            text: "Appointment",
            created_at: "2013-07-17 04:47:37",
            updated_at: "2013-07-17 04:47:37"
        }
    },
    ...
]

دیدید که چگونه اطلاعات جداول مرتبط در گره های جداگانه یک JSON قرار گرفت (مانند class، state و nodeها). در این حالت شما هیچ کنترلی روی اینکه چه ستونهایی از این جداول به شما برسد و چه ستونهایی واکشی نگردد، ندارید، مگر اینکه در تعریف مدل خود، آرایه $hidden را تعریف کنید که مشتمل بر ستونهایی است که قرار نیست از دیتابیس بیرون بیایند و این یک حالت کلی است و تاثیرگذاری آن بر روی همه Eloquentهای مدل شما می‌باشد. بنابراین رویکردی مختص برای محدود کردن ستونهایی که از جداول مرتبط می آیند، وجود ندارد. آرایه $hidden نمی‌تواند در زمان اجرا تغییر کند، بنابراین باید در مدل از پیش تعریف شده باشد. پس یا شما نیاز به مدلهایی با تعریف ویژه دارید یا باید بپذیرید که با بخش بزرگی از داده هایی که از جداول مرتبط به شما بازمی‌گردد، زندگی کنید.

Query Builderها و یک راه نجات

با استفاده از Query Builder در لاراول، می‌توانید JSON را به میزان قابل ملاحظه ای با ستونهای کمتر دریافت کنید. query زیر را ببینید:

$tasks = DB::table('projects')
    ->join('projects_categories', 'projects.category_id', '=', 'projects_categories.id')
    ->join('projects_states'    , 'projects.status_id'  , '=', 'projects_states.id')
    ->join('projects_types'     , 'projects.type_id'    , '=', 'projects_types.id')
    ->orderBy('projects.description')
    ->orderBy('projects.id', 'desc')
    ->where('status_id', '<>', 13)
    ->select('projects.id',
        'projects.status_id',
        'projects.notes',
        'projects.start_time',
        'projects.end_time',
        'projects.labels',
        'projects.description', 
        'projects_categories.text as category',
        'projects_states.text as status',
        'projects_types.text as type')
    ->get();

return $tasks;

JSON زیر تولید می‌شود. Query Builder سطح بالاتری از دسترسی بر روی آنچه در query می‌آید، دارد. برای مثال، توجه داشته باشید که چگونه می‌توانید از "as" در متود select() برای نامگذاری مستعار روی یک ستون استفاده کنید.

[
    {
        id: "2",
        status_id: "1",
        notes: "check-up",
        start_time: "2013-08-04 16:00:00",
        end_time: "2013-08-04 17:00:00",
        labels: "",
        description: "Dr Schnieder",
        category: "Personal",
        status: "Open",
        type: "Appointment"
     },
    ...
]

گرچه تفاوت های آشکار این دو روش، ممکن برای شما این شبهه را ایجاد کند که کدام روش لزوما بهتر است، با در نظر گرفتن حجم پروژه شاید بتوانید به راحتی تخمین بزنید که از کدام روش استفاده کنید.

کامنت ها (0)

ارسال نظر