Laravel API ResourceCollection WhenLoaded

时间:2018-02-07 15:32:54

标签: laravel

我尝试在我的资源数组中包含一个关系,如果它已被急切加载,但不能让它工作。

任何人都有一个想法,我如何检查ResourceCollection中的关系?

数据库架构如下所示: enter image description here

这是我的帖子模型

class Post extends Model
{
    function categories() {
        return $this->belongsToMany('App\Category');
    }
}

这是我的分类模型

class Category extends Model
{
    function posts() {
        return $this->belongsToMany('App\Post');
    }
}

这是我的帖子控制器

Class PostController extends Controller
{
    public function index()
    {
        return new PostResourceCollection(Post::with("categories")->get());
    }
}

这是我的Post ResourceCollection

class PostResourceCollection extends ResourceCollection
{
    public function toArray($request)
    {

        return [
            'data' => $this->collection->transform(function($page){
                return [
                    'type' => 'posts',
                    'id' => $page->id,
                    'attributes'    => [
                        'name' => $page->title,
                    ],
                ];
            }),
            //'includes' => ($this->whenLoaded('categories')) ? 'true' : 'false',
            //'includes' => ($this->relationLoaded('categories')) ? 'true' : 'false',
        ];
    }
}

2 个答案:

答案 0 :(得分:0)

您的关系错误,帖子属于多个类别,而某个类别包含多个帖子所以更改:

class Category extends Model
{
    function posts() {
        return $this->belongsToMany('App\Post', 'category_post');
    }
}

class Category extends Model
{
    function posts() {
        return $this->hasMany('App\Post', 'category_post');
    }
}

现在,当你加载帖子时,你也可以加载类别:

$posts = Post::with('categories')->get();

答案 1 :(得分:0)

来自 docs您需要定义函数,如下面的代码:

class PostResourceCollection extends ResourceCollection
{
  public function toArray($request)
  {

      return [
         'type' => 'posts',
          'id' => $page->id,
          'attributes'    => [
               'name' => $page->title,
           ],
         'categories' => Post::collection($this->whenLoaded('categories')),
    ];
  }
}
  

如果尚未加载关系,则categories密钥将在发送到客户端之前完全从资源响应中删除。