ساخت eloquent api resource قسمت دوم

حمید تیموری 400 بازدید 1398/01/14
ساخت eloquent api resource قسمت دوم

در مطلب قبلی توضیحاتی درباره استفاده از laravel euquent api resource داده شد.

حالا در این مطلب چگونگی استفاده از relation ها را توضیح میدهیم:
در مطلب قبل مدلی به نام Book داشتیم. حالا فکر کنید مدل دیگری به نام Autor داریم که با Book رابطه oneToMany دارد. به این صورت که هر نویسنده میتواند چند کتاب داشته باشد.

روابط به شکل زیر است:

class Book extends Model
{

    public function author()
    {
        return $this->belongsTo(Author::class)->withDefault();
    }
}




class Author extends Model
{

    public function books()
    {
        return $this->hasMany(Book::class);
    }
}

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

<?php

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class Book extends JsonResource
{
    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request $request
     * @return array
     */
    public function toArray($request)
    {
        return [
           'id' => $this->id,
           'title'=>$this->title
           'created_at' => $this->created_at,

           'author' => $this->author->name
        ]
        
    }

}

درمثال بالا میبینید که نام نویسنده هم به خروجی اضافه شده است.
ولی راه های بهتری هم برای این کار نیز وجود دارد.
در هر resource یک متد به نام with وجود دارد که میتوانید relation ها را آنجا نشان دهید.
به کد زیر دقت کنید:

<?php

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class Book extends JsonResource
{
    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request $request
     * @return array
     */
    public function toArray($request)
    {
        return [
            'id' => $this->id_string,
            'title' => $this->title,
            'created_at' => $this->created_at,
        ];
    }

    public function with($request)
    {
        return [
            'author' => $this->author,
        ];
    }
}

کد بالا هنگام نمایش یک نمونه از مدل book ، نویسنده آن را هم نشان میدهد که خروجی به شکل زیر است:

{
   data: {
       id: 1,
       title: "First Book",
       created_at: "2019-03-30 09:52:12.000000",
   },

   author:{
       id: 1,
       name: "Taylor",
       family: "otwell",
       created_at: "2019-03-30 09:52:12.000000",
   }

}

میبینید که نویسنده هم همراه کتاب نمایش داده میشود، اما این اطلاعات format داده نشده اند. شما میتوانید برای نویسنده هم یک resource تعریف کنید
و هنگام load کردن realtion در resource از آن استفاده کنید و اطلاعات نویسنده هم format کنید و شکل دلخواه نمایش دهید:

<?php

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class Book extends JsonResource
{
    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request $request
     * @return array
     */
    public function toArray($request)
    {
        return [
            'id' => $this->id_string,
            'title' => $this->title,
            'created_at' => $this->created_at,
        ];
    }

    public function with($request)
    {
        # you can use AuthorResource
        return [
            'author' => new Author($this->author),
        ];
    }
}

برای طولانی نشدن مطلب، دیگر ویژگی ها را در مطلب بعدی توضیح میدهم!




مقالات مرتبط
امید کیانی 263 بازدید 1398/06/11
حمید تیموری 5404 بازدید 1397/05/27
حمید تیموری 645 بازدید 1397/12/04
حمید تیموری 131 بازدید 1398/10/01
حمید تیموری 628 بازدید 1397/10/22
نظرات (0)
هنوز نظری ثبت نشده است
برای ثبت نظر ابتدا وارد سایت شوید