所以我在三个模型之间有关系:用户,票证和分配。 票证虽然可以分配,但可以有许多用户,到目前为止,我可以检索分配给当前用户的所有票证。
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();
}
}
答案 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)
感谢大家的帮助,感谢您的努力。 我通过在分配表中添加状态字段找到了解决方案。
再次感谢