In PostCrudRepository class I read mediaProps from other class and write as Attribute:
public function get(int $id): Post
{
$post = Post::getById($id)->firstOrFail();
$mediaStorage= App::make(MediaStorageInterface::class);
$mediaProps = $mediaStorage->getMediaById(
id: $id,
mediaId: $post->media_link,
detailedInfo: true
);
$post->setAttribute('mediaProps', $mediaProps);
return $post;
}
In controller I use
public function show(int $id): JsonResponse|MessageBag
{
$post = $this->postCrudRepository->get(id: $id);
return response()->json(['post' => (new PostResource($post))], JsonResponse::HTTP_OK);
}
and in PostResource :
<?php
namespace App\Http\Resources;
use App\Models\Post as PostModel;
use Illuminate\Http\Resources\Json\JsonResource;
class PostResource extends JsonResource
{
public function toArray($request)
{
return [
'id' => $this->id,
'created_at' => $this->created_at,
'mediaProps' => new MediaPropsResource($this->whenLoaded('mediaProps')),
];
}
}
But whenLoaded does work here, I suppose it works only for loaded models, but what have I to use for data set with setAttribute?
mediaProps can be an array or does not exists at all.
mediaPropsIs a relationships?? I think its an attribute right? If yes, thenwhenLoadedwill not work.In this case you have to make changes in your resource like.
Hopefully this will help in your case.