首页 > 解决方案 > 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();
    }
}

标签: phplaravel

解决方案


第一:你正在做一个不必要的额外子查询

第二:尝试使用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();

推荐阅读