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

199
ساخت 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),
        ];
    }
}

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




نظرات (0)
هنوز نظری ثبت نشده است
برای ثبت نظر ابتدا وارد سایت شوید