我有这个数据库结构
table users table office_user table offices
----------- ----------------- -------------
id * id * id *
full_name user_id name
office_id
joined_at
因此在我的项目中,每个办公室都有许多用户,并且用户可以在日期(joined_at)加入多个办公室
User.php模型
public function offices()
{
return $this->belongsToMany('App\Office)->withPivot('joined_at');
}
Office.php模型
public function users()
{
return $this->belongsToMany('App\User)->withPivot('joined_at');
}
OfficeController.php
public function show(Office $office)
{
$users = User::with(array('phones', 'offices' , function($query)
{
$query->orderBy('joined_at', 'desc');
}))->get();
return view('dashboard.offices.show', compact(['office', 'users']));
}
我需要两件事:
1-获取每个办公室的当前用户列表
2-每个办公室的当前用户数
我已经实现了:
<h3>{{ $office->name }}</h3><span>{{ $office->users->count() }}</span>
@foreach ($office->users as $user)
<li>{{ $user->full_name }}</li>
@endforeach
但是结果并不像预期的那样,它给了我某些办公室的所有用户,并且无论他们加入的日期是多少
我希望最近一次加入该办公室的用户列表,并根据数据透视表中的joined_at
字段进行计数
谢谢你,抱歉我的英语
答案 0 :(得分:1)
但是结果并不像预期的那样,它给了我某些办公室的所有用户,并且无论他们加入的日期是多少
当您执行$office->users->count()
时,这是预期的行为,因为您可以随时检索每个办公室的所有关联的users
,因此,假设您返回了所有这些用户,则count()
在集合中执行的将全部计算在内。
您的数据透视属性只是一个timestamp
,那么如何减少返回的用户数量?今天/过去一小时/过去15分钟内加入办公室的用户?
如果是这样,可以将约束添加到count()
方法中以获得所需的结果。
作为示例,在以下几行中,我们将约束具有属于今天的joined_at
的关联办公室:
public function show(Office $office)
{
$users = User::with([
'phones',
'offices' => function ($offices) {
$offices->whereDate('joined_at', '>', now()->startOfDay());
},
])->get();
return view('dashboard.offices.show', compact([office, 'users']));
}
检查文档的this section:
约束渴望的负荷
有时您可能希望加载一段关系,但也要指定 急切加载查询的其他查询条件。这是一个 例如:
$users = App\User::with(['posts' => function ($query) { $query->where('title', 'like', '%first%'); }])->get();
在此示例中,Eloquent仅渴望加载帖子所在的位置
title
列包含单词first
。您可以致电其他查询 进一步定制急切加载操作的构建器方法:$users = App\User::with(['posts' => function ($query) { $query->orderBy('created_at', 'desc'); }])->get();