Eloquent 使用预加载过滤集合
Eloquent Filtering Collection with Eager Loading
我一直在网上查找,但似乎无法弄清楚。
我有两个表:Teams 和 TeamMembers。一个团队可以有一个或多个团队成员,所以是一对多的关系。
下面是两个表的基础:
class Team extends Base\EloquentBase
{
// Relationship
public function teamMembers()
{
return $this->hasMany('TeamClock\Eloquent\Models\TeamMember', 'team_id', 'team_id');
}
}
class TeamMember extends Base\EloquentBase
{
// Relationship
public function team()
{
return $this->belongsTo('TeamClock\Eloquent\Models\Team', 'team_id', 'team_id');
// Scope
public function scopeHasDailyPerDiem($q)
{
return $q->where('is_daily_per_diem', '>', 0);
}
}
如您所见,我在 TeamMember class 中有一个范围,我想获取所有团队成员的列“is_daily_per_diem”大于 0。
我有一个测试控制器,我正在导出结果:
$teams = Team::has('teamMembers')->with(array('teamMembers' => function($query){
$query->hasDailyPerDiem();
}))->get();
这是我在转储时得到的结果:
[0] => Array
(
[team_id] => 55
[phase_id] => value
[team_name] => value
[team_member_quota] => value
[team_member_overstaff] => value
[published] => value
[tools_required] => value
[dress_code] => value
[special_instructions] => value
[team_members] => Array
(
)
)
...
[41] => Array
(
[team_id] => 115
[phase_id] => value
[team_name] => value
[team_member_quota] => value
[team_member_overstaff] => 0
[published] => 1
[tools_required] =>
[dress_code] =>
[special_instructions] =>
[team_members] => Array
(
[0] => Array
(
[team_member_id] => value
[team_id] => 115
[position_id] => value
[employee_id] => value
[team_auth_id] => 1
[progress_auth_id] => 2
[is_daily_per_diem] => 1
[daily_per_diem] => 60.00
[pay_type_id] => 1
[flat_rate] =>
[is_active] => 0
[per_diem_beg_date] =>
[per_diem_end_date] =>
[beg_shift_id] =>
[end_shift_id] =>
[assign_email_guid] => value
)
)
)
如您所见,我混合了有团队成员的团队(即每日出差 > 0)和没有团队成员的团队。
有没有办法消除没有团队成员的团队?
我还在我的测试控制器中尝试了这个和其他东西:
$teams = Team::whereHas('teamMembers', function($query){
$query->hasDailyPerDiem();
})->get();
但这将返回一个数组,其中包含“每日津贴”大于零的所有团队成员,但我没有获得任何团队信息:
[0] => Array
(
[team_id] => 55
[phase_id] => value
[team_name] => value
[team_member_quota] => value
[team_member_overstaff] => value
[published] => value
[tools_required] => value
[dress_code] => value
[special_instructions] => value
)
...
[36] => Array
(
[team_id] => 115
[phase_id] => value
[team_name] => value
[team_member_quota] => value
[team_member_overstaff] => value
[published] => value
[tools_required] => value
[dress_code] => value
[special_instructions] => value
)
非常感谢任何帮助!!!
你快完成了...
如果要过滤团队和急加载成员:
$teams = Team::with('teamMembers')->whereHas('teamMembers', function($query){
$query->hasDailyPerDiem();
})->get();
如果您想过滤团队和急切加载的成员:
$teams = Team::with(['teamMembers' => function($query){
$query->hasDailyPerDiem();
}])->whereHas('teamMembers', function($query){
$query->hasDailyPerDiem();
})->get();
如果要减少与第二个代码块的重复代码,请将过滤器闭包放在变量中:
$filter = function($query){
$query->hasDailyPerDiem();
};
$teams = Team::with(['teamMembers' => $filter])
->whereHas('teamMembers', $filter)
->get();
定义一个实现 Scope 接口的 class
class TeamFilterScope 实现作用域{
public function apply(Builder $builder, Model $model){
$builder->hasDailyPerDiem()
}
}
在你模特的靴子里
protected function static boot(){
parent::boot();
static::addGlobalScope(new TeamFilterScope());
}
我一直在网上查找,但似乎无法弄清楚。 我有两个表:Teams 和 TeamMembers。一个团队可以有一个或多个团队成员,所以是一对多的关系。
下面是两个表的基础:
class Team extends Base\EloquentBase
{
// Relationship
public function teamMembers()
{
return $this->hasMany('TeamClock\Eloquent\Models\TeamMember', 'team_id', 'team_id');
}
}
class TeamMember extends Base\EloquentBase
{
// Relationship
public function team()
{
return $this->belongsTo('TeamClock\Eloquent\Models\Team', 'team_id', 'team_id');
// Scope
public function scopeHasDailyPerDiem($q)
{
return $q->where('is_daily_per_diem', '>', 0);
}
}
如您所见,我在 TeamMember class 中有一个范围,我想获取所有团队成员的列“is_daily_per_diem”大于 0。
我有一个测试控制器,我正在导出结果:
$teams = Team::has('teamMembers')->with(array('teamMembers' => function($query){
$query->hasDailyPerDiem();
}))->get();
这是我在转储时得到的结果:
[0] => Array
(
[team_id] => 55
[phase_id] => value
[team_name] => value
[team_member_quota] => value
[team_member_overstaff] => value
[published] => value
[tools_required] => value
[dress_code] => value
[special_instructions] => value
[team_members] => Array
(
)
)
...
[41] => Array
(
[team_id] => 115
[phase_id] => value
[team_name] => value
[team_member_quota] => value
[team_member_overstaff] => 0
[published] => 1
[tools_required] =>
[dress_code] =>
[special_instructions] =>
[team_members] => Array
(
[0] => Array
(
[team_member_id] => value
[team_id] => 115
[position_id] => value
[employee_id] => value
[team_auth_id] => 1
[progress_auth_id] => 2
[is_daily_per_diem] => 1
[daily_per_diem] => 60.00
[pay_type_id] => 1
[flat_rate] =>
[is_active] => 0
[per_diem_beg_date] =>
[per_diem_end_date] =>
[beg_shift_id] =>
[end_shift_id] =>
[assign_email_guid] => value
)
)
)
如您所见,我混合了有团队成员的团队(即每日出差 > 0)和没有团队成员的团队。
有没有办法消除没有团队成员的团队?
我还在我的测试控制器中尝试了这个和其他东西:
$teams = Team::whereHas('teamMembers', function($query){
$query->hasDailyPerDiem();
})->get();
但这将返回一个数组,其中包含“每日津贴”大于零的所有团队成员,但我没有获得任何团队信息:
[0] => Array
(
[team_id] => 55
[phase_id] => value
[team_name] => value
[team_member_quota] => value
[team_member_overstaff] => value
[published] => value
[tools_required] => value
[dress_code] => value
[special_instructions] => value
)
...
[36] => Array
(
[team_id] => 115
[phase_id] => value
[team_name] => value
[team_member_quota] => value
[team_member_overstaff] => value
[published] => value
[tools_required] => value
[dress_code] => value
[special_instructions] => value
)
非常感谢任何帮助!!!
你快完成了...
如果要过滤团队和急加载成员:
$teams = Team::with('teamMembers')->whereHas('teamMembers', function($query){
$query->hasDailyPerDiem();
})->get();
如果您想过滤团队和急切加载的成员:
$teams = Team::with(['teamMembers' => function($query){
$query->hasDailyPerDiem();
}])->whereHas('teamMembers', function($query){
$query->hasDailyPerDiem();
})->get();
如果要减少与第二个代码块的重复代码,请将过滤器闭包放在变量中:
$filter = function($query){
$query->hasDailyPerDiem();
};
$teams = Team::with(['teamMembers' => $filter])
->whereHas('teamMembers', $filter)
->get();
定义一个实现 Scope 接口的 class
class TeamFilterScope 实现作用域{
public function apply(Builder $builder, Model $model){
$builder->hasDailyPerDiem()
}
}
在你模特的靴子里
protected function static boot(){
parent::boot();
static::addGlobalScope(new TeamFilterScope());
}