1

I'm having some issues loading my relationships into a ResourceCollection to be consumed by an API, I want to load blogs that each belong to a category.

The blog model which uses a belongsTo relationship

    <?php
    namespace App\Models;

    use Illuminate\Database\Eloquent\Factories\HasFactory;
    use Illuminate\Database\Eloquent\Model;
    use Illuminate\Database\Eloquent\Relations\BelongsTo;
    use Illuminate\Database\Eloquent\SoftDeletes;

    class BlogPost extends Model {
        use HasFactory, SoftDeletes;

        protected $fillable = [
            'title',
            'content',
            'seo_title',
            'seo_content',
        ];

        public function categories(): BelongsTo {
            return $this->belongsTo(BlogCategory::class);
        }
    }

The Category model has a hasMany to blogs

    <?php
    namespace App\Models;

    use Illuminate\Database\Eloquent\Factories\HasFactory;
    use Illuminate\Database\Eloquent\Model;
    use Illuminate\Database\Eloquent\Relations\HasMany;

    class BlogCategory extends Model {
        use HasFactory;

        protected $fillable = [
            'slug'
        ];

        public function blogs(): HasMany {
            return $this->hasMany(BlogPost::class);
        }
    }

Inside of the blog_post migration, I added a foreign key to blog_categories

    $table->foreignId('category_id')->constrained('blog_categories');

Then, in my BlogPost ResourceCollection I tried loading the relationship,

    #[ArrayShape(['data' => "\Illuminate\Support\Collection", 'category' => AnonymousResourceCollection::class])] public function toArray($request): array {
        return [
            'data' => $this->collection,
            'category' => BlogCategoryCollection::make($this->whenLoaded($this->categories))
        ];
    }

I call the collection inside of the index function of my controller

    public function index(): BlogPostCollection
    {
        return new BlogPostCollection(BlogPost::all());
    }

And when I hit the api/blogs endpoint I get the error :

    Property [categories] does not exist on this collection instance. 
niels van hoof
  • 469
  • 4
  • 19

1 Answers1

0

Managed to fix it in the end.

Changed the BlogPostResourceCollection to the following

       return [
            'data' => $this->collection,
            'categories' => BlogCategoryCollection::collection($this->whenLoaded('categories'))
        ];

seems to work in the end.

niels van hoof
  • 469
  • 4
  • 19