building an array from looping an object - php

I am working on a laravel application at the moment, and I am trying to create an array from an object that is returned from the database by eloquent. The object looks like this,
[
{
"id": 3,
"body": "Fake User created the project Fake Project 2",
"uri": "8jss90xk",
"object_id": 422,
"user": [
{
"id": 25,
"email": "xxxxxxxxxx#gmail.com",
"first_name": "xxx1",
"last_name": "xxxx1",
"display_name": "xxxxxxxxxxx",
"initials": "XX",
"remember_me": null,
"active": "1",
"invite_code": null,
"forgotten_code": null,
"cost_visible": 0,
"login_type": "normal",
"api_token": null,
"created_at": "2015-02-13 11:47:24",
"updated_at": "2015-05-06 22:43:23",
"deleted_at": null,
"pivot": {
"notification_id": 3,
"user_id": 25,
"is_read": 0
}
}
],
"project": {
"id": 422,
"name": "Project Number 1",
"slug": "Tdc3de97",
"uri_hash": "project-number-1",
"description": null,
"total_cost": "1000.00",
"start_date": "2015-07-21",
"finish_date": "2015-10-22",
"status": 2,
"sales_person": null,
"client_id": 0,
"organisation_id": 97,
"owner_id": 97,
"user_id": 25,
"locked_by": null,
"created_at": "2015-07-21 13:39:21",
"updated_at": "2015-07-24 10:07:38",
"deleted_at": null,
"archived_at": "0000-00-00 00:00:00",
"invoiced_at": null,
"is_internal": 0
}
},
{
"id": 4,
"body": "Fake User created the project Fake Project 3",
"uri": "8jss90xk",
"object_id": 422,
"user": [
{
"id": 25,
"email": "XXXXXX#gmail.com",
"first_name": "XXXXX",
"last_name": "XXXXXXXX",
"display_name": "XXX",
"initials": "XX",
"remember_me": null,
"active": "1",
"invite_code": null,
"forgotten_code": null,
"cost_visible": 0,
"login_type": "normal",
"api_token": null,
"created_at": "2015-02-13 11:47:24",
"updated_at": "2015-05-06 22:43:23",
"deleted_at": null,
"pivot": {
"notification_id": 4,
"user_id": 25,
"is_read": 0
}
}
],
"project": {
"id": 422,
"name": "Project Number 1",
"slug": "Tdc3de97",
"uri_hash": "project-number-1",
"description": null,
"total_cost": "1000.00",
"start_date": "2015-07-21",
"finish_date": "2015-10-22",
"status": 2,
"sales_person": null,
"client_id": 0,
"organisation_id": 97,
"owner_id": 97,
"user_id": 25,
"locked_by": null,
"created_at": "2015-07-21 13:39:21",
"updated_at": "2015-07-24 10:07:38",
"deleted_at": null,
"archived_at": "0000-00-00 00:00:00",
"invoiced_at": null,
"is_internal": 0
}
},
{
"id": 5,
"body": "Fake User created the project Fake Project 4",
"uri": "8jss90xk",
"object_id": 422,
"user": [
{
"id": 25,
"email": "XXXXXXX#gmail.com",
"first_name": "XXXXXX",
"last_name": "XXXXXXX",
"display_name": "XXXXXXX",
"initials": "XX",
"remember_me": null,
"active": "1",
"invite_code": null,
"forgotten_code": null,
"cost_visible": 0,
"login_type": "normal",
"api_token": null,
"created_at": "2015-02-13 11:47:24",
"updated_at": "2015-05-06 22:43:23",
"deleted_at": null,
"pivot": {
"notification_id": 5,
"user_id": 25,
"is_read": 0
}
}
],
"project": {
"id": 422,
"name": "Project Number 1",
"slug": "Tdc3de97",
"uri_hash": "project-number-1",
"description": null,
"total_cost": "1000.00",
"start_date": "2015-07-21",
"finish_date": "2015-10-22",
"status": 2,
"sales_person": null,
"client_id": 0,
"organisation_id": 97,
"owner_id": 97,
"user_id": 25,
"locked_by": null,
"created_at": "2015-07-21 13:39:21",
"updated_at": "2015-07-24 10:07:38",
"deleted_at": null,
"archived_at": "0000-00-00 00:00:00",
"invoiced_at": null,
"is_internal": 0
}
}
}]
Basically the query returns all the users with unread notifications, and I want to build that into array along with any notifications and send an email but the array needs to be quite specific with the details it contains.
I imagine sending something like this to mail function that will send the reminders,
'user#emailaddress.com' => array(
'first_name' => 'User',
'last_name' => 'Lastname',
'projects' => array(
'Project Title 1' => array(
'notifications' => array(
[0] => 'Notification 1',
[1] => 'Notification 2',
[2] => 'Notification 3'
)
)
)
)
I cannot for the live of me work out how to build this array from my object, I currently have this in my code,
foreach($unread as $object) {
$emails_to_send = array(
'user' => $object->user[0],
'uri' => $object->uri,
'body' => $object->body,
'project' => $object->project
);
}
This however builds the wrong structure and overwrites the last loop.

The reason why you get the data overwritten in the last loop is because you assing newly created array to $emails_to_send variable instead of appending to the array. Try the following:
$emails_to_send = array();
foreach($unread as $object) {
$emails_to_send[] = array(
'user' => $object->user[0],
'uri' => $object->uri,
'body' => $object->body,
'project' => $object->project
);
}
var_dump($emails_to_send);
This should give you a list containing one entry for each email that needs to be sent.

You are wright you have to iterate through your resulting array but like this:
// First create the final array
$emails_to_send = array();
foreach($unread as $object) {
// Add new array element with the email key
$emails_to_send[$object->user[0]->email] = array(
'first_name' => $object->user[0]->first_name,
'last_name' => $object->user[0]->last_name,
'project' => $object->project
);
}
var_export($emails_to_send);
As a result you will see something like:
array(
'user#emailaddress.com' => array(
'first_name' => 'User',
'last_name' => 'Lastname',
'project' => array(
"id" => 422,
"name" => "Project Number 1",
"slug" => "Tdc3de97",
"uri_hash" => "project-number-1",
...
)
),
...
)

Related

How to get latest data with groupBy in Laravel 8

I want to make a chat app. So I can get a list of patient but the top last message doesn't have the patient.
How to solve my problem.
PHP :
$appointment = Appointment::with([
'upcoming.consultant' => function($query) use ($user) {
$query->where('consultant_id', $user->consultant_id);
},
'patient',
'conversation' => function($query) {
$query->latest();
}
])
->groupBy('patient_id')
->get('patient_id');
Result Json Data :
[
{
"appointment_id": 16,
"upcoming_id": 72,
"patient_id": 5,
"payment_id": 22,
"child_id": null,
"time_slot": "2023-02-08 00:47:00",
"is_child": 0,
"is_presented": 0,
"is_rejected": 0,
"meet_at": null,
"diseases": null,
"comments": null,
"created_at": "2023-02-08 22:07:01",
"updated_at": "2023-02-08 22:07:01",
"deleted_at": null,
"upcoming": {
"upcoming_id": 72,
"consultant_id": 1,
"package_id": 1,
"price": "10",
"title": "abcd",
"start": "2023-02-08 00:47:00",
"end": "2023-02-08 01:47:00",
"total_appointment": 2,
"spend_time": 10,
"who_inserted": "3",
"created_at": "2023-02-08 18:48:21",
"updated_at": "2023-02-08 18:48:21",
"deleted_at": null,
"consultant": null
},
"patient": {
"patient_id": 5,
"salutation": "MR",
"first_name": "Apis Technologies",
"last_name": "#NutriInfo",
"email": "apislk.nutriinfo#gmail.com",
"email_verified_at": "2023-02-08 14:28:33",
"dob": "2023-02-08 00:00:00",
"image": null,
"tp": "+1 (935) 591-6866",
"tp_verified_at": null,
"gender": "Male",
"country": "Afghanistan",
"language": "si",
"address": "Exercitation volupta",
"city": "Matale",
"state": null,
"zipcode": null,
"created_at": "2023-02-08 14:28:33",
"updated_at": "2023-02-10 00:56:02",
"deleted_at": null
},
"conversation": {
"id": 2,
"appointment_id": 16,
"sender": 5,
"receiver": 1,
"massege": "a",
"is_read": 0,
"is_document": 0,
"who_inserted": "patient",
"document_link": null,
"created_at": "2023-02-08 22:07:55",
"updated_at": "2023-02-08 22:07:55",
"deleted_at": null
}
}
]
With groupBy
(Actually I want this way with last message)
PHP :
$appointment = Appointment::with([
'upcoming.consultant' => function($query) use ($user) {
$query->where('consultant_id', $user->consultant_id);
},
'patient',
'conversation' => function($query) {
$query->latest();
}
])->get();
Result Json Data :
[
{
"patient_id": 4,
"upcoming": null,
"patient": {},
"conversation": null
},
{
"patient_id": 5,
"upcoming": null,
"patient": {},
"conversation": null
}
]
Thank You
to retrieve a list of appointments grouped by patient ID, with the last conversation message for each patient. However, the resulting JSON data only contains patient ID, upcoming appointment details, patient details, and conversation details, but not the patient name.
To include the patient name in the resulting JSON data, you can modify your code to include the first_name and last_name fields from the patient table in the select statement
$appointment = Appointment::with([
'upcoming.consultant' => function($query) use ($user){
$query->where('consultant_id', $user->consultant_id);
},
'patient' => function($query) {
$query->select('patient_id', 'salutation', 'first_name', 'last_name');
},
'conversation' => function($query) {
$query->latest();
}
])
->groupBy('patient_id')
->get(['patient_id']);
This will select only the patient_id, salutation, first_name, and last_name fields from the patient table, and include them in the resulting JSON data. You can adjust the select statement to include more fields from the patient table if needed.
Note that the resulting JSON data will only include the fields that are selected in the get method. If you need to include more fields in the JSON data, you should add them to the get method. This will include the upcoming, patient, and conversation fields in the resulting JSON data.
$appointment = Appointment::with([
'upcoming.consultant' => function($query) use ($user){
$query->where('consultant_id', $user->consultant_id);
},
'patient' => function($query) {
$query->select('patient_id', 'salutation', 'first_name', 'last_name');
},
'conversation' => function($query) {
$query->latest();
}
])
->groupBy('patient_id')
->get(['patient_id', 'upcoming', 'patient', 'conversation']);
Thank you all
I solved it my way..
PHP
$user = $request->user();
$appointment = Appointment::with(
[
'upcoming.consultant' => function($query) use ($user){
$query->where('consultant_id', $user->consultant_id);
},
'patient','conversation'
])
->has('conversation')
->get();
$patientList = Appointment::with(
[
'upcoming.consultant' => function($query) use ($user){
$query->where('consultant_id', $user->consultant_id);
},
'patient','conversation' => function($query){
$query->latest();
}
])
->groupBy('patient_id')
->get('patient_id');
$list = array();
foreach ($patientList as $key1 => $patient) {
foreach ($appointment as $key2 => $row) {
if($patient->patient_id == $row->patient_id){
$keyList = $this->searchForId($row->patient_id,$list);
if(is_null($keyList)){
array_push($list,[
'patient'=>$row->patient,
'conversation' => $row->conversation
]);
}else{
$currentDate = Carbon::parse($list[$keyList]['conversation']['created_at']);
$newDate = Carbon::parse($row->conversation->created_at);
// dd($newDate->gt($currentDate));
if ($newDate->gt($currentDate)) {
$list[$keyList] = [
'patient'=>$row->patient,
'conversation' => $row->conversation
];
}
}
}
}
}
foreach ($list as $key => $part) {
$sort[$key] = strtotime($part['conversation']['created_at']);
}
array_multisort($sort, SORT_DESC, $list);
return view('consultant.chat', [
'patients' => $list
]);
JSON
[
{
"patient": {
"patient_id": 5,
"salutation": "MR",
"first_name": "Apis Technologies",
"last_name": "#NutriInfo",
"email": "apislk.nutriinfo#gmail.com",
"email_verified_at": "2023-02-08 14:28:33",
"dob": "2023-02-08 00:00:00",
"image": null,
"tp": "+1 (935) 591-6866",
"tp_verified_at": null,
"gender": "Male",
"country": "Afghanistan",
"language": "si",
"address": "Exercitation volupta",
"city": "Matale",
"state": null,
"zipcode": null,
"created_at": "2023-02-08 14:28:33",
"updated_at": "2023-02-10 00:56:02",
"deleted_at": null
},
"conversation": {
"id": 153,
"appointment_id": 16,
"sender": 5,
"receiver": 1,
"massege": "a",
"is_read": 0,
"is_document": 0,
"who_inserted": "patient",
"document_link": null,
"created_at": "2023-02-18 16:07:55",
"updated_at": "2023-02-18 16:07:55",
"deleted_at": null
}
},
{
"patient": {
"patient_id": 4,
"salutation": "MR",
"first_name": "Alexa",
"last_name": "PAKAYA",
"email": "sajith#apis.lk",
"email_verified_at": null,
"dob": "2013-07-24 00:00:00",
"image": null,
"tp": "+94772193832",
"tp_verified_at": null,
"gender": "Male",
"country": "Nigeria",
"language": "si",
"address": "Sunt corporis offic",
"city": null,
"state": null,
"zipcode": null,
"created_at": "2023-01-04 01:13:07",
"updated_at": "2023-02-16 09:24:37",
"deleted_at": null
},
"conversation": {
"id": 152,
"appointment_id": 24,
"sender": 3,
"receiver": 4,
"massege": "asd",
"is_read": 0,
"is_document": 0,
"who_inserted": "consultant",
"document_link": null,
"created_at": "2023-02-18 15:18:20",
"updated_at": "2023-02-18 15:18:20",
"deleted_at": null
}
}
]

Laravel convert array to single object when one related model is specified

I'm working inside a Laravel 9 project. I have a model called Affiliate which defines a hasMany relationship on my AffiliateProduct model. My AffiliateProduct defines a hasOne relationship for both a Product and Country.
An affiliate can have multiple products, but when the related product and country model are specified, I'd like to return a single entry instead of AffiliateProduct being an array, for example, right now I'd have to do:
$affiliate[0]->products->country
But I'd like to just be able to do:
$affiliate->products->country
Here's my query:
// get affiliate
$affiliate = Affiliate::where('aff_id', $request->input('AffId'))
->where('allow_submission', true)
->where('is_enabled', true)
->with([
'products' => function ($query) use ($productSlug, $countrySlug) {
$query->whereHas('product', function ($q) use ($productSlug) {
$q->where('slug', $productSlug)
->orWhere('is_default', true)
->where('is_enabled', true);
})->whereHas('country', function ($q) use ($countrySlug) {
$q->where('slug', $countrySlug)
->orWhere('is_default', true)
->where('is_enabled', true);
});
},
'products.product',
'products.country'
])
->first();
And this is what my current JSON output looks like:
{
"Result": "Accepted",
"Message": "Yay!",
"Model": {
"id": 2,
"user_id": 1,
"company_id": 1,
"aff_id": "test",
"description": "test",
"api_hash": "test",
"allow_submission": true,
"is_favourited": false,
"is_default": false,
"is_enabled": true,
"last_used_at": null,
"created_at": "2023-02-01T15:19:40.000000Z",
"updated_at": "2023-02-01T15:19:40.000000Z",
"deleted_at": null,
"is_deleting": false,
"products": [
{
"id": 7,
"user_id": 3,
"company_id": 1,
"affiliate_id": 2,
"country_id": 1,
"product_id": 1,
"serve_method_id": 3,
"application_form_id": null,
"pingtree_group_id": 1,
"callback_url": null,
"callback_condition": null,
"duplicate_response": null,
"created_at": "2023-02-01T15:39:01.000000Z",
"updated_at": "2023-02-01T15:39:01.000000Z",
"deleted_at": null,
"is_deleting": false,
"product": {
"id": 1,
"user_id": 1,
"company_id": 1,
"name": "Payday",
"slug": "payday",
"description": "Support brokering loan leads via an application.",
"is_default": true,
"is_enabled": true,
"created_at": "2023-02-01T15:19:39.000000Z",
"updated_at": "2023-02-01T15:19:39.000000Z",
"deleted_at": null,
"is_deleting": false
},
"country": {
"id": 1,
"user_id": 1,
"company_id": 1,
"country_code": "GB",
"calling_code": "44",
"name": "United Kingdom",
"slug": "united-kingdom",
"description": "United Kingdom of Great Britain and Northern Ireland",
"currency": "GBP",
"is_default": true,
"is_enabled": true,
"created_at": "2023-02-01T15:19:39.000000Z",
"updated_at": "2023-02-01T15:19:39.000000Z",
"deleted_at": null,
"is_deleting": false
}
}
]
}
}
Also, any tips on potentially improving my query would be appreciated.

Laravel I can't retrieve requester data using with

I am using this package
https://github.com/renoki-co/befriended
My issue is trying to get all my friends posts with my post including user's data, but the problem is the requester data is null.
$user = $request->user();
$followersPost = UserPost::with(['user' => function ($query) use ($user) {
$query->filterFollowingsOf($user);
}])->latest()->get();
return $followersPost;
Response
[
{
"id": 35,
"post_body": "The Requster Post",
"location_id": "4b0da1acf964a520b94c23e3",
"location_title": "Apple Infinite Loop",
"location_icon": "https://ss3.4sqi.net/img/categories_v2/shops/technology_bg_44.png",
"location_coordinate": "{"latitude":37.33167558501772,"longitude":-122.030189037323,"latitudeDelta":0.001,"longitudeDelta":0.001}",
"location_vicinity": "Cupertino - 1 Infinite Loop",
"user_id": 1,
"viewer_ids": null,
"created_at": "2020-12-06T18:08:58.000000Z",
"updated_at": "2020-12-06T18:08:58.000000Z",
"images": [
],
"musics": [
],
"movies": [
],
"emojs": [
],
"user": null
},
{
"id": 34,
"post_body": "Test Post",
"location_id": "4b0da1acf964a520b94c23e3",
"location_title": "Apple Infinite Loop",
"location_icon": "https://ss3.4sqi.net/img/categories_v2/shops/technology_bg_44.png",
"location_coordinate": "{"latitude":37.33167558501772,"longitude":-122.030189037323,"latitudeDelta":0.001,"longitudeDelta":0.001}",
"location_vicinity": "Cupertino - 1 Infinite Loop",
"user_id": 2,
"viewer_ids": null,
"created_at": "2020-12-06T18:08:14.000000Z",
"updated_at": "2020-12-06T18:08:14.000000Z",
"images": [
],
"musics": [
],
"movies": [
],
"emojs": [
],
"user": {
"id": 2,
"_id": "dfa19aa6-510b-4aaf-8475-4386da9de3d0",
"name": "Saleh",
"username": "saleh",
"email": "saleh#gmail.com",
"email_verified_at": null,
"avatar": "http://backend.mf.sa/storage/avatars/1607128041.jpg",
"location": null,
"gender": "male",
"bio": null,
"birthday": null,
"phone": null,
"created_at": "2020-12-05T00:27:02.000000Z",
"updated_at": "2020-12-05T00:27:21.000000Z"
}
},
{
"id": 24,
"post_body": null,
"location_id": null,
"location_title": null,
"location_icon": null,
"location_coordinate": null,
"location_vicinity": null,
"user_id": 3,
"viewer_ids": null,
"created_at": "2020-12-06T01:53:18.000000Z",
"updated_at": "2020-12-06T01:53:18.000000Z",
"images": [
],
"musics": [
{
"id": 4,
"post_id": 24,
"song_name": "Confetti",
"song_preview": "https://cdns-preview-6.dzcdn.net/stream/c-6eb643a05083c023f874f13739fc7c87-3.mp3",
"song_picture": "https://api.deezer.com/album/183603832/image",
"song_artist": "Little Mix",
"created_at": "2020-12-06T01:53:18.000000Z",
"updated_at": "2020-12-06T01:53:18.000000Z"
}
],
"movies": [
],
"emojs": [
{
"id": 16,
"post_id": 24,
"user_id": 3,
"emojy": "015-smile-1",
"created_at": "2020-12-06T01:59:15.000000Z",
"updated_at": "2020-12-06T01:59:15.000000Z",
"user": {
"id": 3,
"_id": "af65864b-f18a-4609-91db-336acbce1486",
"name": "Ali",
"username": "ali2323",
"email": "ali#gmail.com",
"email_verified_at": null,
"avatar": null,
"location": null,
"gender": "male",
"bio": null,
"birthday": null,
"phone": null,
"created_at": "2020-12-05T04:05:50.000000Z",
"updated_at": "2020-12-05T04:05:50.000000Z"
}
},
{
"id": 17,
"post_id": 24,
"user_id": 1,
"emojy": "089-broken-heart",
"created_at": "2020-12-06T16:58:07.000000Z",
"updated_at": "2020-12-06T16:58:24.000000Z",
"user": {
"id": 1,
"_id": "737ba284-424d-4b0d-8a56-2e845603f2ba",
"name": "Mohammed",
"username": "mohammed",
"email": "h4ck3r.x0#gmail.com",
"email_verified_at": null,
"avatar": "http://backend.mf.sa/storage/avatars/1607128001.jpg",
"location": null,
"gender": "male",
"bio": null,
"birthday": null,
"phone": null,
"created_at": "2020-12-05T00:26:09.000000Z",
"updated_at": "2020-12-05T00:26:41.000000Z"
}
},
{
"id": 19,
"post_id": 24,
"user_id": 2,
"emojy": "021-sad",
"created_at": "2020-12-06T16:58:36.000000Z",
"updated_at": "2020-12-06T16:58:36.000000Z",
"user": {
"id": 2,
"_id": "dfa19aa6-510b-4aaf-8475-4386da9de3d0",
"name": "Saleh",
"username": "saleh",
"email": "saleh#gmail.com",
"email_verified_at": null,
"avatar": "http://backend.mf.sa/storage/avatars/1607128041.jpg",
"location": null,
"gender": "male",
"bio": null,
"birthday": null,
"phone": null,
"created_at": "2020-12-05T00:27:02.000000Z",
"updated_at": "2020-12-05T00:27:21.000000Z"
}
}
],
"user": {
"id": 3,
"_id": "af65864b-f18a-4609-91db-336acbce1486",
"name": "Ali",
"username": "ali2323",
"email": "ali#gmail.com",
"email_verified_at": null,
"avatar": null,
"location": null,
"gender": "male",
"bio": null,
"birthday": null,
"phone": null,
"created_at": "2020-12-05T04:05:50.000000Z",
"updated_at": "2020-12-05T04:05:50.000000Z"
}
}
]
As you can see the first object in the array dosen't include the user data.
So what should i do $query->filterFollowingsOf($user); to include my data?
I think the with callback is used for modifying the query that selects the user data. Instead, try using a whereHas method that filters the related users.
$user = $request->user();
$followersPost = UserPost
::with('user')
->whereHas('user', function ($query) use ($user) {
$query->filterFollowingsOf($user);
})
->latest()
->get();
return $followersPost;
I'd also recommend using paginate() instead of get() for performance when there could be a significant number of posts.
Edit:
To get either your friend's posts or your posts, try:
$followersPost = UserPost
::with('user')
->whereHas('user', function ($query) use ($user) {
$query->filterFollowingsOf($user);
})
->orWhere('user_id', $user->id)
->latest()
->get();

How to modify array structure returned by eloquent in laravel

I currently have the below array structure that I get when running Bonus::with('users')->get()
I have tried adding the array and merging similar keys but it is not working. I tried using the helper methods provided in laravel but I don't seem to be able to get it working.
[
{
"id": 1,
"users_id": 1,
"bonus_type_id": 1,
"is_paid": 0,
"amount": "100.00",
"description": "desc",
"note": null,
"created_by": 2,
"last_modified_by": null,
"created_at": null,
"updated_at": null,
"deleted_at": null,
"user": {
"id": 1,
"name": "test",
"email": "test#testing.com",
"email_verified_at": null,
"status": 1,
"created_at": "2019-07-18 11:41:35",
"updated_at": "2019-07-18 11:41:35",
"deleted_at": null
}
},
{
"id": 2,
"users_id": 1,
"bonus_type_id": 2,
"is_paid": 0,
"amount": "100.00",
"description": "desc",
"note": null,
"created_by": 2,
"last_modified_by": null,
"created_at": null,
"updated_at": null,
"deleted_at": null,
"user": {
"id": 1,
"name": "test",
"email": "test#testing.com",
"email_verified_at": null,
"status": 1,
"created_at": "2019-07-18 11:41:35",
"updated_at": "2019-07-18 11:41:35",
"deleted_at": null
}
},
{
"id": 3,
"users_id": 2,
"bonus_type_id": 2,
"is_paid": 1,
"amount": "100.00",
"description": "desc",
"note": null,
"created_by": 2,
"last_modified_by": null,
"created_at": null,
"updated_at": null,
"deleted_at": null,
"user": {
"id": 1,
"name": "another test",
"email": "another#testing.com",
"email_verified_at": null,
"status": 1,
"created_at": "2019-07-18 11:41:35",
"updated_at": "2019-07-18 11:41:35",
"deleted_at": null
}
}
]
I want the result to be something like that
[
{
user_id: 1,
name: "test",
bonuses: [
{
bonus_type_id: 1,
amount: 100,
is_paid: 0,
},
{
bonus_type_id: 2,
amount: 100,
is_paid: 0,
}
],
},
{
user_id: 2,
name: "another",
bonuses: [
{
bonus_type_id: 2,
amount: 100,
is_paid: 1,
},
]
}
]
You need to change your eloquent relationship. Define hasMany relationship function bonuses inside User model for bonuses table and use that to get the desired result like so:
User::with('bonuses')->get();
That way it will return results from users table and populate bonuses for each user.
makes sense?
You can get specific information with select subquery, if your relations are correctly set, this should work.
User::select('user_id','name','bonus_id')
->with(array('bonuses'=> function($query){
$query->select('bonus_type_id','amount','is_paid');
}))->get();

API Resources laravel filter data

So i am trying to get some data pass to an array and send to json.
But when i do this i am getting alot of information:
This is the response:
{
"current_page": 1,
"data": [{
"id": 2,
"object_id": 3,
"booking_id": 1,
"sender_id": 1,
"receiver_id": 2,
"message": "It is accepted",
"type_id": 5,
"read": 1,
"archive": 0,
"star": 0,
"created_at": "2019-02-26 11:45:28",
"updated_at": "2019-02-26 12:15:11",
"created_time": "26\/02\/2019",
"host_user": 0,
"guest_user": 1,
"sender": {
"id": 1,
"first_name": "Joe",
"last_name": "Cos",
"email": "email-91#hotmail.com",
"profile_image": null,
"balance": 0,
"status": "Active",
"created_at": "2019-02-21 15:19:26",
"updated_at": "2019-02-21 15:19:26",
"profile_src": "http:\/\/xxx.com\/public\/images\/user_pic-225x225.png"
},
"bookings": {
"id": 1,
"object_id": 3,
"code": "mYuL4p",
"host_id": 1,
"user_id": 2,
"start_date": "2019-02-26",
"end_date": "2019-02-27",
"status": "Accepted",
"guest": 0,
"total_night": 1,
"per_night": 20,
"base_price": 20,
"cleaning_charge": 0,
"guest_charge": 0,
"service_charge": 0,
"security_money": 0,
"host_fee": 0,
"total": 20,
"booking_type": "request",
"currency_code": "EUR",
"cancellation": "Flexible",
"transaction_id": "67427302T32774838",
"payment_method_id": 1,
"accepted_at": "2019-02-26 11:45:28",
"expired_at": null,
"declined_at": null,
"cancelled_at": null,
"cancelled_by": null,
"created_at": "2019-02-26 11:37:36",
"updated_at": "2019-02-26 11:45:28",
"host_payout": 23,
"label_color": "success",
"date_range": "Feb 26 - 27, 2019",
"expiration_time": "2019\/02\/27 11:37:36",
"currency": {
"id": 3,
"name": "Europe",
"code": "EUR",
"symbol": "€",
"rate": "0.88",
"status": "Active",
"default": "0",
"org_symbol": "€"
}
},
"object_address": {
"id": 3,
"object_id": 3,
"address_line_1": "XXXXXXXXX, 4050-352 Porto, Portugal",
"address_line_2": null,
"latitude": "49.999",
"longitude": "-8.88810419921",
"city": "P",
"state": "P",
"country": "P",
"postal_code": "4050-352"
}
}],
"from": 1,
"last_page": 1,
"next_page_url": null,
"per_page": 10,
"prev_page_url": null,
"to": 1,
"total": 1
}
I am using the API Resources
In MY Resource i have:
return parent::toArray($request);
With this i get all that information my problem is i need to filter some data
and when i try to filter for exemple the email.
return [
'email'=> $this->email,
];
it gives error and says
"Property [email] does not exist on this collection instance."
I am learning and i am a newbie i am sorry for this dumb questions.
Thanks to all!
First make a trait
trait ResourceHelpers
{
/**
* Remove null values from Eloquent api resource
* #param array $data
* #return array
*/
public function removeNullValues(array $data)
{
$filtered_data = [];
foreach ($data as $key => $value) {
$filtered_data[$key] = $this->when($value !== null, $value);
}
return $filtered_data;
}
}
Then use it in your resource
class UserResource extends JsonResource
{
use ResourceHelpers;
/**
* Transform the resource into an array.
*
* #param \Illuminate\Http\Request $request
* #return array
*/
public function toArray($request)
{
return $this->removeNullValues([
"id" => $this->id,
"first_name" => $this->first_name,
"last_name" => $this->last_name,
"phone" => $this->phone,
"email" => $this->email,
"balance" => $this->balance,
'address' => $this->address,
'city' => $this->city,
'state' => $this->state,
'zip_code' => $this->zip_code,
'country' => CountryResource::make($this->whenLoaded('country')),
"joined_at" => $this->created_at,
"updated_at" => $this->updated_at,
]);
}
}
In your resource:
$return = parent::toArray($request);
unset($return['email']);
return $return;
Or, you can explicitly define just what you do want to return, instead of relying on toArray:
return [
'id' => $this->id,
'message' => $this->message,
// and so on...
];
This gives you more control over the final API response, especially if you make database/model changes but need the API to remain unchanged.

Categories