【发布时间】:2020-10-02 15:57:43
【问题描述】:
使用 Laravel 7.0
我有 3 个模型(Meeting、MeetingVersion 和 User), 和 4 个表格(Meeting、meeting_versions、users、meeting_versions_users)。
一个Meeting有很多MeetingVersion模型,其中每个版本都与User有many-to-many关系。每个 MeetingVersion 都有一个指向其父 Meeting 的外键 meeting_id。用户通过 meeting_versions_users 数据透视表关联到一个 MeetingVersion。
现在,我想选择最新版本与给定用户 ID 相关联的所有会议。
会议课
public function versions()
{
return $this->hasMany(MeetingVersion::class, 'meeting_id');
}
MeetingVersion 类
public function users()
{
return $this->belongsToMany(User::class, 'meeting_versions_users', 'version_id', 'user_id');
}
表格
会议
+----+
| id |
+----+
| 10 |
| 11 |
+----+
meeting_versions
+----+------------+---------+
| id | meeting_id | version |
+----+------------+---------+
| 31 | 10 | 1 |
| 32 | 10 | 2 |
| 33 | 10 | 3 | <- latest version (33) for meeting id 10
| 34 | 11 | 1 |
| 35 | 11 | 2 | <- latest version (35) for meeting id 11
+----+------------+---------+
meeting_versions_users
+------------+---------+
| version_id | user_id |
+------------+---------+
| 31 | 101 |
| 32 | 101 |
| 33 | 102 | <- user associated with latest version for meeting id 10
| 34 | 101 |
| 35 | 101 | <- user associated with latest version for meeting id 11
+------------+---------+
用户
+-----+
| id |
+-----+
| 101 |
| 102 |
+-----+
这是我正在尝试的查询。我应该只返回会议 11,但此查询返回用户 101 的两个会议。
// Some user id.
$userId = 101;
// Query to get all meetings where user is associated with latest version of meeting.
$meeting = Meeting::query()->where(function (Builder $query) use ($userId) {
$query->whereHas('versions', function (Builder $query) use ($userId) {
/*
* I want to get just the "latest" version model here, so that further queries are constrained to that model only.
* As it is now, the below whereHas query is applied to all child models.
* Using $query->latest('version')->limit(1) doesn't work here as expected.
*
* So, I need to a way to limit the following whereHas query to the latest version.
* This constraint should be applied to just the "latest" model relation, instead of all models.
*/
$query->whereHas('users', function (Builder $query) use ($userId) {
$query->where('id', $userId);
});
});
})->get();
非常感谢任何帮助。
【问题讨论】:
标签: laravel eloquent laravel-query-builder eloquent-relationship laravel-7.x