Laravel在相关模型中为用户获得最后一行

时间:2018-10-12 13:35:16

标签: php laravel

所以我在三个模型之间有关系:用户,票证和分配。 票证虽然可以分配,但可以有许多用户,到目前为止,我可以检索分配给当前用户的所有票证。

AssignsTable

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();
    }
}

3 个答案:

答案 0 :(得分:2)

首先:您正在执行不必要的额外子查询

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

答案 1 :(得分:1)

好吧,如果要检索分配给用户的所有票证,则需要建立关系,例如:

use App\Ticket;
use App\User;

class Ticket extends Model
{
    /**
     * There is no need to explicitly put the foreign keys 
     * in the relation if there are named as the model
     */
    public function users() 
    {
        return $this->belongsToMany(User::class, 'assigns')->withTimestamps()->withPivot(['id']);
    }
}

class User extends Model
{
    public function tickets() 
    {
        return $this->belongsToMany(Ticket::class, 'assigns')->withTimestamps()->withPivot(['id']);
    }
}

访问User模型实例上的“票证”属性将检索分配给他的所有票证

$userTickets = User::find(1)->tickets; // will retrive ALL the records on 'AssignsTable' that have the field 'user_id' equals to 1

如果要检索User :: find(1)的所有票证,但第一张票证(ID = 1的票证)除外,则需要在查询中明确排除ID 1,这样:

$allUserTicketsExceptTheTicketWithId1 = User::find(1)->tickets()->wherePivot('id', '!=', 1)->get();

答案 2 :(得分:0)

感谢大家的帮助,感谢您的努力。 我通过在分配表中添加状态字段找到了解决方案。

再次感谢