php - Laravel 过滤有很多结果

标签 php database laravel eloquent

我有三个表 - Campaigns、Actions 和 Activists。一个 Campaign 有很多 Action,一个 Action 既属于 Activist 又属于 Campaign。

每个 Action 都有一个 client_id(来自它所属的事件的 client_id),因此当客户查看事件家列表时,他们应该只会看到那些在他们的事件中采取了行动的人。

同样,在查看个人事件家时,他们应该只看到与他们的事件相关的那些操作。

模型

事件.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');
}

事件家.php

public function actions()
{
    return $this->hasMany('Action');
}

Controller

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,但在他们采取行动的地方,我会再次看到他们的所有行动和完整计数。

澳大利亚足球联盟。有一些明显的东西我错过了,对吧?

谢谢。

[编辑]更新添加:

在 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);
}

最佳答案

我现在已经解决了这个问题,但供引用:

$activist->actions()->count()

这显然是事后诸葛亮,忽略了任何先前的查询,并简单地计算从 activities 模型中定义的 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? - 关系必须以驼峰命名法描述(actions_client > actionsClient)。

关于php - Laravel 过滤有很多结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25474917/

相关文章:

php - 在 Laravel 5.1 中通过 AJAX 将用户输入数据从 View 传递到 Controller

javascript - Laravel 4.2 Vuejs

php - 使用sql过滤最新评论

php - 如何在 Javascript 和 PHP 中验证非英语(UTF-8)编码的电子邮件地址?

sql - SQLite 只插入一个标识符

php - 使用 PHP Laravel 5.6 的 Quickbooks 桌面应用程序

javascript - 查询 Mongoose 以按名称查找所有内容,然后选择最后创建的

mysql - 查找具有某些特定功能的所有类别

php - Symfony2 - 更改包名称后的 Twig 异常

php - Heroku PHP 和 Apache dyno 崩溃并出现错误 H10