php - Laravel 获取相关模型中用户的最后一行
问题描述
所以我在三个模型之间有关系:用户、票证和分配。一个工单可以有很多用户,但到目前为止,我可以检索分配给当前用户的所有工单。
分配表
id|ticket_id |user_id |created_at
1 |30 |1 |2018-10-12 10:17:42
2 |30 |2 |2018-10-12 11:17:51
3 |31 |1 |2018-10-12 11:18:00
4 |32 |3 |2018-10-12 12:18:00
5 |33 |1 |2018-10-12 12:30:00
询问
$tickets = Ticket::with('AssignedUsers')
->WhereHas('AssignedUsers', function($q) {
$q->where('assigns.user_id', '=', '1')
->latest('assigns.created_at')
->groupBy('assigns.ticket_id')
->orderBy('assigns.id');
})
->get();
结果
id |ticket_id |user_id |created_at
1 |30 |1 |2018-10-12 10:17:42
3 |31 |1 |2018-10-12 11:18:00
5 |33 |1 |2018-10-12 12:30:00
预期成绩
id|ticket_id |user_id |created_at
3 |31 |1 |2018-10-12 11:18:00
5 |33 |1 |2018-10-12 12:30:00
正如您在上面看到的,我想对用户 1 隐藏票证,以防它被分配给另一个票证。
票务模式
class Ticket extends Model
{
public function AssignedUsers()
{
return $this->belongsToMany(User::class, 'assigns','ticket_id','user_id')
->withTimestamps();
}
}
解决方案
第一:你正在做一个不必要的额外子查询
第二:尝试使用with group by,我没有运行查询,但我认为它会起作用
$tickets = Ticket::with(['AssignedUsers' => function($q){
$q->where('assigns.user_id', '=', '1')
->latest('assigns.created_at')
->groupBy('assigns.ticket_id')
->orderBy('assigns.id')
->havingRaw('count(assigns.ticket_id) <= 1');
}])
->get();
推荐阅读
- javascript - 根据键从对象创建一个值数组
- c++ - 多个类之间的C++循环依赖
- firebase - Flutter - Firebase - 按列表项值查询
- swift - 为什么我的 collectionview 单元格没有动画?
- javascript - 如何用图像和文本填充一个数组值?- HTML/Javascript
- java - Firestore 未按请求的顺序返回结果
- html - 路径错误添加背景图片
- android - (ART/DVM) 在 :try_end 指令之前插入一条指令会导致 VerifyError
- oauth - 使用 Akka HTTP 客户端为 oauth1 签署 http 请求
- c - c函数返回两个不同类型的指针