Php 拉威尔滤波有很多结果
我有三张桌子——运动、行动和活动家。一场运动有许多行动,一个行动同时属于活动家和运动 每个活动都有一个客户id(来自其所属活动的客户id),因此,当客户查看活动者列表时,他们应该只看到对其活动之一采取行动的人 类似地,当查看个人维权人士时,他们应该只查看与其活动相关的行为 型号 Campaign.phpPhp 拉威尔滤波有很多结果,php,database,laravel,eloquent,Php,Database,Laravel,Eloquent,我有三张桌子——运动、行动和活动家。一场运动有许多行动,一个行动同时属于活动家和运动 每个活动都有一个客户id(来自其所属活动的客户id),因此,当客户查看活动者列表时,他们应该只看到对其活动之一采取行动的人 类似地,当查看个人维权人士时,他们应该只查看与其活动相关的行为 型号 Campaign.php public function actions() { return $this->hasMany('Action'); } Action.php public function
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');
}
vigators.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();
}
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);
}
我看到了以下情况:
在/Activities页面上,我正确地看到了那些采取了与我的客户id相关的行动的活动家,以及他们所采取的每一项行动。类似地,count()返回所有活动者操作的完整计数
在/activities/{id}页面上,如果激进分子没有采取任何与我的客户_id相关的行动,它将正确地返回null,但是在他们采取行动的地方,我再次看到他们的所有行动和完整计数
AFL。很明显我错过了什么,对吧
谢谢。
[编辑]更新为添加: 在with和whereHas上使用client_id过滤器可以纠正“所有操作都不考虑显示”问题,但计数问题仍然存在(我不确定这是否是改进此问题的正确方法): ActivistController.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();
}
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);
}
我现在已经解决了这个问题,但仅供参考:
$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();
}
在索引上。我以前曾尝试过这种方法,但如这里所述--关系必须用camelCase(actions\u client>actionsClient)来描述。在我的使用中,这种方法对我有效:
$clients = Profile::select('id', 'name')->orderBy('initial')->whereHas('type', function ($query) {
$query->where('slug', 'client');
})->office()->pluck('name', 'id');
您已经有$Activator的实例正在加载他们的操作,这意味着您已经知道Activator的操作,因为它们已经在实例中了,那么为什么还要再次调用actions(),而不仅仅是这样做:
$activist->actions->count()
也许你可以试试这个