I'm using Laravel 8. I would like to have a query, where all items from the users
table are listed twice, one with created_at column, and second with updated_at column. The result of this array should be in an ascending date order (mix of created_at and updated_at dates).
My table:
Expected result:
Zoey 2022-10-19 ...
Peter 2022-10-20 ...
Zoey 2022-10-24 ...
Peter 2022-10-31 ...
How to do that in Laravel 8?
CodePudding user response:
First, create two queries:
$result_one = DB::table('table')->select(['name','created_at AS field_date'])->get();
$result_two = DB::table('table')->select(['name','updated_at AS field_date'])->get();
Then merge the collections
$results = $result_one->merge($result_two);
And then you can sort them.
$sorted_result = $results->sortBy('field_date');
CodePudding user response:
In order to accomplish this, you can use the union()
method in Eloquent. Also, be sure to use selectRaw()
so you can alias the date columns as date
. The union will need the columns to have the same name:
$usersCreatedAt = User::selectRaw('name, created_at AS date');
$usersUpdatedAt = User::selectRaw('name, updated_at AS date');
$users = $usersCreatedAt->union($usersUpdatedAt)->orderBy('date')->get();
The result would be a collection like this:
Illuminate\Database\Eloquent\Collection {#5108
all: [
App\Models\User {#5451
name: "Zoey",
date: "2022-10-19 18:46:50",
},
App\Models\User {#5467
name: "Peter",
date: "2022-10-20 18:47:00",
},
App\Models\User {#5443
name: "Zoey",
date: "2022-10-24 18:46:55",
},
App\Models\User {#5459
name: "Peter",
date: "2022-10-31 18:47:06",
},
],
}
Then you can get the array from it using ->toArray()
:
return $users->toArray();
Edit: Another good solution by @aynber. That solution uses Query Builder. So it depends on your code style on which you use :)