skip to Main Content

I’m trying to orderBy() data from db based on field created by relationship with() without success. I’m using laravel/php and mongodb.

Here’s my model relationship :

public function game(): BelongsTo
{
    return $this->belongsTo(Game::class, 'game_id');
}

Here’s my data structure :

{
    "_id":"25673",
    "game_id":"4",
    "user_id":"22",
    "score":50,
    "created_at":"2021-09-11T17:04:32.473000Z",
    "user" : {
        "_id":"22",
        "email":"[email protected]"
    },
    "game": {
        "_id": "4",
        "name":"Snake" //==>orderBy this field 
    }
},

And here’s my request :

 $gamesPlayedRequest = GamesPlayed::select('created_at', 'user_id', 'game_id', 'score')
        ->with('game:id,name')
        ->orderBy('game.name', 'DESC'); //==>the field 'game.name' is not reachable

So I would like to order my data by the name of the game.

I don’t get any error, but the data are not sorted properly or effectively. For a little bit of context : the data are displayed in a table, and when the user click on the header of the column "Game" he-she can re-order the games by there name (alphabetically or reverse).

I can I sort my data with the name of the game (field created by the relationship) in php and with mongodb ?

Thank you,

2

Answers


  1. Give this a try, if I remember correctly the orderBy will not be applied to the relational data and just to the parent model. Not sure what the initial model is so just replace parent_table with whatever suits your tables.

    $gamesPlayedRequest = DB::table('parent_table')
        ->join('games', 'games.id', '=', 'parent_table.game_id')
        ->select('parent_table.*', 'games.id', 'games.name')
        ->orderBy('game.name')
        ->get();
    
    Login or Signup to reply.
  2. You can order the result collection directly like this :

    $gamesPlayedRequest = GamesPlayed::select('created_at', 'user_id', 'game_id', 'score') 
        ->with('game:id,name') 
        ->orderBy('game.name', 'DESC') 
        ->get() 
        ->sortByDesc('game.name');
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search