How to get latest data with groupBy in Laravel 8 - php

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
}
}
]

Related

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.

Change Laravel belongsToMany() returned data format

I'm using belongsToMany() in my Laravel model and i need to change the function return format.
public function platform_information(): BelongsToMany
{
return $this->belongsToMany(
PlatformInformation::class,
'platform_information_artist',
'artist_id',
'platform_information_id')->withPivot([
'date', 'value'
]);
}
When I call the function
$artist->platform_information()
->orderBy('platform_information_id', 'asc')
->orderBy('date', 'asc')
->get()
Returns the following data:
[
{
"id": 1,
"platform": "spotify",
"information": "monthly_listeners",
"description": null,
"created_at": null,
"updated_at": null,
"deleted_at": null,
"pivot": {
"artist_id": 1,
"platform_information_id": 1,
"date": "2022-11-09",
"value": 55400500
}
},
{
"id": 1,
"platform": "spotify",
"information": "monthly_listeners",
"description": null,
"created_at": null,
"updated_at": null,
"deleted_at": null,
"pivot": {
"artist_id": 1,
"platform_information_id": 1,
"date": "2022-11-10",
"value": 55395190
}
},
{
"id": 2,
"platform": "spotify",
"information": "followers",
"description": null,
"created_at": null,
"updated_at": null,
"deleted_at": null,
"pivot": {
"artist_id": 1,
"platform_information_id": 2,
"date": "2022-11-09",
"value": 25390584
}
},
{
"id": 2,
"platform": "spotify",
"information": "followers",
"description": null,
"created_at": null,
"updated_at": null,
"deleted_at": null,
"pivot": {
"artist_id": 1,
"platform_information_id": 2,
"date": "2022-11-10",
"value": 25410584
}
}
]
The data obtained are correct, but not in the format in which I need them.
This is the format that i need:
[
{
"id": 1,
"platform": "spotify",
"information": "monthly_listeners",
"data" : [
{
"artist_id": 1,
"platform_information_id": 1,
"date": "2022-11-09",
"value": 55400500
},
{
"artist_id": 1,
"platform_information_id": 1,
"date": "2022-11-10",
"value": 55395190
}
]
},
{
"id": 2,
"platform": "spotify",
"information": "followers",
"data" : [
{
"artist_id": 1,
"platform_information_id": 2,
"date": "2022-11-09",
"value": 25390584
},
{
"artist_id": 1,
"platform_information_id": 2,
"date": "2022-11-10",
"value": 25410584
}
]
}
]
Is there any way to do this using the belongsToMany() function directly?
Or do I have to do it manually in the controller?
I had not tested it but what I have get from the question, it should work.
I am assuming that you have a model Artist in your Models directory.
$artist = \App\Models\Artist::with('platform_information')->get();
Then you can dd() to verify the format
dd($artist->toArray());

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

How can I hidden data in JSON if variable is empty

I got a some trouble in my Laravel application, in Search function, when I do search the result is
{
"data": [
{
"id": 2,
"user_id": 8,
"identity_number": "213918273",
"name": "Pekerja_2",
"gender_id": 1,
"date_of_birth": "1999-05-25",
"address": "Jalan Bandung Raya no 50",
"province_id": 32,
"city_id": 3273,
"district_id": 3273160,
"phone": "4232343432",
"image": null,
"created_at": "2018-01-11 10:59:54",
"updated_at": "2018-01-11 10:59:54",
"partner_id": null,
"skill": [
{
"id": 3,
"worker_id": 2,
"skill_id": 6,
"sub_skill_id": 18,
"created_at": "2018-01-15 13:06:48",
"updated_at": "2018-01-15 13:06:48",
"price": null,
"unit": null
}
]
},
{
"id": 3,
"user_id": 16,
"identity_number": "213918273",
"name": "Pekerja_3",
"gender_id": 1,
"date_of_birth": "1999-05-25",
"address": "Jalan Bandung Raya no 50",
"province_id": 32,
"city_id": 3273,
"district_id": 3273160,
"phone": "2345234234",
"image": null,
"created_at": "2018-01-15 13:06:48",
"updated_at": "2018-01-15 13:06:48",
"partner_id": null,
"skill": []
}
]
}
as you can see that "Skill" with id number 3 is empty, I want all in id number 3 is empty also.
My controller is :
$worker = Worker::with(['skill' => function($q) use ($request) {
$q->where('worker_skills.sub_skill_id', $request['sub_skill_id']);
}])->whereHas('skill');
And I want something like this :
{
"data": [
{
"id": 2,
"user_id": 8,
"identity_number": "213918273",
"name": "Pekerja_2",
"gender_id": 1,
"date_of_birth": "1999-05-25",
"address": "Jalan Bandung Raya no 50",
"province_id": 32,
"city_id": 3273,
"district_id": 3273160,
"phone": "2534234234",
"image": null,
"created_at": "2018-01-11 10:59:54",
"updated_at": "2018-01-11 10:59:54",
"partner_id": null,
"skill": [
{
"id": 3,
"worker_id": 2,
"skill_id": 6,
"sub_skill_id": 18,
"created_at": "2018-01-15 13:06:48",
"updated_at": "2018-01-15 13:06:48",
"price": null,
"unit": null
}
]
},
]
}
The point is, if "skill" variable is empty then data not show and vice versa.
Thankyou any help will appreciate, sorry for bad english
You can add a callback to your whereHas function with the same filter as the with function
$worker = Worker::with(['skill' => function($q) use ($request) {
$q->where('worker_skills.sub_skill_id', $request['sub_skill_id']);
}])
->whereHas('skill', function($q) use ($request) {
$q->where('worker_skills.sub_skill_id', $request['sub_skill_id']);
})
->get();
You can try this $worker = Worker:has('skill')->get();
Only worker that have at least one skill are contained in the collection

Categories