【问题标题】:How to order by a second relationship in Laravel query?如何在 Laravel 查询中按第二个关系排序?
【发布时间】:2019-12-01 00:28:40
【问题描述】:

我有一个问题,我一直在转动我的轮子一段时间。我有一个非常复杂的(可能不正确 - 或者说是最有效的)数据结构,我正试图通过逻辑来解决这个问题。

我想知道如何对单个查询的第二个关系函数执行查询 (orderBy)。我什至不确定这是否是描述它的正确方式,所以这是我的代码:

$players = $team->players()
    ->wherePivot('year_id', $year->id)
    ->with(['stats' => function ($query) {
        $query->orderBy('score', 'desc');
    }])
    ->get();

看起来应该很简单,但是orderBy 子句不起作用。否则查询有效(返回玩家及其统计数据)。以下是我的人际关系的建立方式:

Team -> belongsToMany Player (and vice versa)
Player -> belongsToMany Stat (and vice versa)

在这种情况下,我的每个数据透视表都有一个额外的键,除了两个指定的表之外,它们还有一个year_id。这是因为这种关系只与特定年份相关,我认为这可能是让事情变得更加复杂的原因。例如,我的team_player 表如下所示:

team_id
player_id
year_id

我的player_stat 表如下所示:

player_id
stat_id
year_id

我不确定这是否是实现我想要的最有效或最好的方法,但在构建时它是有意义的。那么我怎样才能通过这个架构来使这个查询工作呢?此外,任何关于数据结构可能会更好地工作的反馈也将不胜感激。

【问题讨论】:

    标签: laravel eloquent logic relationship


    【解决方案1】:
    $players = $team->players()->wherePivot('year_id', $year->id)->with('stats')->orderBy('stats.score', 'desc')->get();
    

    【讨论】:

      【解决方案2】:

      如果我理解正确,您想对所有玩家(而不是统计数据)进行排序,您需要加入表格:

      $players = $team->players()
              ->wherePivot('year_id', $year->id)
              ->with(['stats'])
              ->join('stats', 'stats.player_id', '=', 'players.id')
              ->orderBy('stats.score', 'desc')
              ->get();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-02-25
        • 2017-01-11
        • 2013-03-28
        • 2021-03-18
        • 2019-05-14
        • 2017-03-10
        • 1970-01-01
        相关资源
        最近更新 更多