【问题标题】:Eloquent query all the latest records for each idEloquent 查询每个 id 的所有最新记录
【发布时间】:2019-09-11 20:11:43
【问题描述】:

我想做这样的事情,但使用 Eloquent:get latest record for each ID

就我个人而言,我有三个表:Game、Assignments、Users。

游戏通过分配表分配给用户。但是,当需要将游戏分配给新用户时,我只需进行新的分配,然后为每个游戏取消最新的分配。

我的最终目标是能够获取任何给定用户分配给他们的游戏集合。但是,要做到这一点,我首先需要能够查询分配并过滤掉任何不是该给定游戏 ID 的最新分配。

有什么想法吗?我一直在尝试一些事情(见下文)但没有成功。

游戏功能(作品):

public function latestAssignment() {
  return $this->hasOne('App\Models\Game_Assignment', 'game_id')->latest();
}

Game_Assignment 函数:

public function isLatestAssignment() {
  if($this->game->latestAssignment()->id == $this->id) {
    return true;
  } else {
    return false;
  }
}

用户函数(抛出错误):

public function current_game_assignments() {
  return $this->hasMany('App\Models\Game_Assignment', 'statistician_id')->where('isLatestAssignment', true);
}

让我知道你们认为我能做什么!

【问题讨论】:

  • 一个游戏一次只能分配一个用户吗?换句话说,如果用户更改后,如果游戏没有以前的游戏分配,那么您的数据是否具有相同的含义? (不是想删除旧作业,只是想了解你的逻辑!)
  • 是的,一个游戏一次只能分配一个用户。但是,数据不会具有相同的含义。在管理端,我希望能够跟踪用户必须多久将游戏重新分配给他们(或他们)
  • 当然,在大多数情况下,丢弃数据并不是要走的路。只需要这些信息。
  • 当然。谢谢!

标签: laravel eloquent


【解决方案1】:

您可以在子查询中使用最新分配用户的 ID 选择您的游戏。然后,您可以使用利用此子查询列的特殊关系连接到 users 表:

class Game extends Model
{
    public function latestUser()
    {
        return $this->hasOne(User::class, 'id', 'latest_user_id');
    }
}


$games = Game::query()
    ->select('*') // necessary to avoid overrides by selectSub()
    ->selectSub(
        Assignment::query()
            ->whereColumn('game_assignments.game_id', 'games.id') // table prevents ambiguity
            ->latest()
            ->select('game_assignments.user_id')
            ->take(1),
        'latest_user_id'
    )
    ->with('latestUser')
    ->get();

重新阅读您的问题后,我得出了不同的解决方案。如果您想要特定用户的所有游戏,该用户是最新分配的用户,您可以使用以下查询。它在包装上使用了一点技巧,但没有这个就不允许过滤子查询:

// only for demonstration purposes
$user  = User::find(1);

$games = Game::query()
    ->fromSub(
        Game::query()
            ->select('*') // necessary to avoid overrides by selectSub()
            ->selectSub(
                Assignment::query()
                    ->whereColumn('game_assignments.game_id', 'games.id')
                    ->latest()
                    ->select('game_assignments.user_id')
                    ->take(1),
                'latest_user_id'
            ),
        'games'
    )
    ->where('latest_user_id', $user->id)
    ->get();

请注意,子查询别名(第二个参数)必须是您游戏的表名。

【讨论】:

  • 我不得不在 whereColumn (错误)之后去掉逗号,但是当我实现它时,它会返回系统上的所有游戏,而不仅仅是那个统计学家的游戏。也不知道为什么...
  • 好的,重新阅读问题后添加了另一个查询。对不起,逗号顺便说一句,一定忽略了它。
猜你喜欢
  • 2020-07-29
  • 2021-01-10
  • 2019-11-04
  • 2021-11-11
  • 1970-01-01
  • 2021-10-04
  • 1970-01-01
  • 1970-01-01
  • 2011-11-22
相关资源
最近更新 更多