Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 拉威尔滤波有很多结果_Php_Database_Laravel_Eloquent - Fatal编程技术网

Php 拉威尔滤波有很多结果

Php 拉威尔滤波有很多结果,php,database,laravel,eloquent,Php,Database,Laravel,Eloquent,我有三张桌子——运动、行动和活动家。一场运动有许多行动,一个行动同时属于活动家和运动 每个活动都有一个客户id(来自其所属活动的客户id),因此,当客户查看活动者列表时,他们应该只看到对其活动之一采取行动的人 类似地,当查看个人维权人士时,他们应该只查看与其活动相关的行为 型号 Campaign.php public function actions() { return $this->hasMany('Action'); } Action.php public function

我有三张桌子——运动、行动和活动家。一场运动有许多行动,一个行动同时属于活动家和运动

每个活动都有一个客户id(来自其所属活动的客户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');
}
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()
也许你可以试试这个