【问题标题】:Laravel API ResourceCollection WhenLoadedLaravel API ResourceCollection WhenLoaded
【发布时间】:2025-12-27 10:55:12
【问题描述】:

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

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

数据库架构如下所示:

这是我的帖子模型

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());
    }
}

这是我的帖子资源集合

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',
        ];
    }
}

【问题讨论】:

  • 你管理这个工作了吗?
  • 不再与 Laravel 打交道,但在下面找到了答案。这似乎在这个时间点起作用
  • 那你可以回答*.com/questions/57478314/…

标签: laravel


【解决方案1】:

你们的关系是错误的,一个帖子属于很多类别一个类别有很多帖子所以改变:

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

【讨论】:

  • 感谢您的回复。测试了一下,没有任何效果。可以肯定的是,加载类别不是问题。我只是无法在我的 ResourceCollection 中引用它。就像这里描述的:laravel.com/docs/5.5/…
  • 通常一篇文章只属于一个类别,因为类别的概念是,它们是分层的。否则它们是标签。但是让我们举个例子:问题中的关系是正确的,您也可以在文档laravel.com/docs/5.5/eloquent-relationships#many-to-many 中阅读。两端都是belongsToMany
【解决方案2】:

知道了.. 那是缺失的部分。如果有人对此有更好的解决方案,将不胜感激。

      foreach ($this->collection as $item) {
          if ($item->relationLoaded('categories')) {
              $included = true;
          }

【讨论】:

    【解决方案3】:

    也许为时已晚,以下解决方案是针对这种情况的解决方法:

    return [
        ...,
        'includes' => $this->whenLoaded('categories', true),
    ];
    

    加载自定义属性:

    return [
        ...,
        'includes' => $this->whenLoaded('categories', fn() => $this->categories->name),
    ];
    

    【讨论】: