I want to return a list of appointments for a given user (Appointment table contains user_id
and post_id
).
The problem is, the returned collection only got the name and place for the first appointment.
public function index()
{
// Retrieve all appointments from the user
$appointments = Appointment::where('user_id', Auth::user()->id)->get();
// Retrieve all post IDs associated with the appointments
$postIds = $appointments->pluck('post_id')->toArray();
// Retrieve all posts with the associated post IDs
$posts = Post::whereIn('id', $postIds)->get()->keyBy('id');
// Assign post details to each appointment
$appointments = $appointments->map(function ($appointment) use ($posts) {
$postId = $appointment->post_id;
if (isset($posts[$postId])) {
$post = $posts[$postId];
$appointment->name = $post->name;
$appointment->place = $post->place;
} else {
// For debugging purposes, log the missing post details
Log::info("Post details not found for appointment: " . $appointment->id);
}
return $appointment;
});
return $appointments;
}
And the result I got in postman is below:
[
{
"id": 4,
"user_id": 9,
"post_id": 2,
"date": "6/14/2023",
"day": "Wednesday",
"time": "12:00 PM",
"status": "upcoming",
"created_at": "2023-06-12T17:19:58.000000Z",
"updated_at": "2023-06-12T17:19:58.000000Z",
"name": "Biskra",
"place": "Tolga"
},
{
"id": 5,
"user_id": 9,
"post_id": 9,
"date": "6/24/2023",
"day": "Saturday",
"time": "14:00 PM",
"status": "cancel",
"created_at": "2023-06-12T18:53:45.000000Z",
"updated_at": "2023-06-12T18:53:45.000000Z"
},
{
"id": 6,
"user_id": 9,
"post_id": 8,
"date": "6/17/2023",
"day": "Saturday",
"time": "12:00 PM",
"status": "complete",
"created_at": "2023-06-13T01:43:14.000000Z",
"updated_at": "2023-06-13T01:43:14.000000Z"
}
]
I want to get the list of appointments of user with the information of each appointment (date, time, day, post_name, post_place)
2
Answers
The issue is with the attempt to modify original appointments to get the results, Please check your code
The results has to be placed in different variable to get the correct result out
You can use Eloquent: API Resources if you are building an API to transform the data as you need.
Change your index function to eager load
post
with appointments and return aresource collection.
If your Appoinment model does not already have a
post
relation, add it.Create a new resource using below command
In your
AppHttpResourcesAppointmentResource
;If you don’t need to transform data and just need to access the data you can just access
post
relation when you are iterating in the view like$appoinment->post->name
.