我有三张桌子 - 广告系列,动作和活动家。 Campaign有许多操作,Action既属于Activist又属于Campaign。
每个操作都有一个client_id(来自其所属广告系列的client_id),因此当客户查看活动家列表时,他们应该只看到那些对其中一个广告系列采取了操作的人。
同样,在查看个人活动家时,他们应该只看到与其广告系列相关的操作。
模型
Campaign.php
public function actions()
{
return $this->hasMany('Action');
}
action.php的
public function campaign()
{
return $this->belongsTo('Campaign', 'campaign_id');
}
public function activist()
{
return $this->belongsTo('Activist', 'activist_id');
}
Activists.php
public function actions()
{
return $this->hasMany('Action');
}
控制器
ActivistsController.php
public function index()
{
$activists = Activist::with('actions')->whereHas('actions', function($q) {
$user = Sentry::getUser();
$q->where('client_id', $user->client_id);
}))->get();
foreach ($activists as $activist)
{
$activist->total = $activist->actions()->count();
}
}
public function getActivist($id)
{
$activist = Activist::with('actions')->whereHas('actions', function($q) {
$user = Sentry::getUser();
$q->where('client_id', $user->client_id);
})->find($id);
$activist->total = $activist->actions()->count();
}
我看到以下内容:
在/ activists页面上,我正确地只看到那些采取了与我的client_id相关的操作的活动家,以及他们所采取的每项行动。同样,count()返回所有活动家的完整计数。动作。
在/ activists / {id}页面上,如果活动家没有采取任何与我的client_id相关的操作,它会正确返回null,但是如果他们有,我再次看到他们的所有操作和完整计数。
AFL。我有一些明显的失明,对吧?
感谢。
[edit]已更新以添加:
在with和whereHas上使用client_id过滤器可以纠正所有出现的操作,无论这些操作是什么?问题,但计数问题仍然存在(我不确定这是远程改善这一点的正确方法):
ActivistController.php
public function index()
{
$filter = function($q) {
$user = Sentry::getUser();
$q->where('client_id', $user->client_id);
};
$activists = Activist::with(array('actions' => $filter))
->whereHas('actions', $filter)
->get();
}
public function getActivist($id)
{
$filter = function($q) {
$user = Sentry::getUser();
$q->where('client_id', $user->client_id);
};
$activist = Activist::with(array('actions' => $filter))
->whereHas('actions', $filter)
->find($id);
}
答案 0 :(得分:10)
我现在已经解决了这个问题,但需要参考:
$activist->actions()->count()
显然,事后看来,这会忽略任何先前的查询,并简单地计算从激活模型中定义的actions()方法返回的数据。
我应该在模型中提供另一种方法,包括适当的where函数,如下所示:
public function actionsClient($id)
{
return $this->hasMany('Action')->where('client_id', $id);
}
意味着可以使用以下命令调用计数:
$activist->total = $activist->actionsClient($id)->count();
单个广告系列和
foreach ($activists as $activist)
{
$activist->total = $activist->actionsClient($activist->id)->count();
}
索引上的。我之前尝试过此操作,但正如此处所述 - How to access model hasMany Relation with where condition? - 必须在camelCase(actions_client> actionsClient)中描述关系。
答案 1 :(得分:0)
在我的用法中,这对我有用:
$clients = Profile::select('id', 'name')->orderBy('initial')->whereHas('type', function ($query) {
$query->where('slug', 'client');
})->office()->pluck('name', 'id');
答案 2 :(得分:0)
你已经让$ activist的实例渴望加载他们的行为,这意味着你已经知道活动家的行为,因为他们已经在实例中,所以为什么再次调用actions()而不是仅仅这样做:
$activist->actions->count()