Eloquent. Fetching multiple relations and ordering them

- 1 answer

Ad

I have a user model which belongs to many 'event' and also belongs to many 'me_resource'.

For an activity log I want to get all of the users events and me resources then order them by the pivots updated_at attributes.

Something like this is what I am looking for

user->events()->me_resources()->orderBy('pivot.updated_at')->get()

But of course me_resource is a relation on user not on events and also they are each related to user via a different pivot table.

Here is an example of what the query should return

id:87, resource_name:'hello', ..., updated_at:21/12/2015 //newest
id:32, event_name:'meeting', ..., updated_at: 20/11/2015 // second newest
id:11, resource_name:'questions', ..., updated_at: 27/02/2015 // third newest 
Ad

Answer

Ad

If you want to keep using Eloquent relations, I'd suggest using Collections to handle the logic for you. Using the query builder probably would be more efficient though.

$user = User::with('events', 'me_resources')->find($user_id);

$collection = new \Illuminate\Database\Eloquent\Collection();
$collection->merge($user->events);
$collection->merge($user->me_resources);
$results = $collection->sortByDesc('updated_at');
Ad
source: stackoverflow.com
Ad