簡體   English   中英

Laravel過濾有很多結果

[英]Laravel filtering hasMany results

我有三個表 - 活動,行動和活動家。 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);
}

我現在已經解決了這個問題,但供參考:

$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();
}

在索引上。 我之前嘗試過這個,但是如此處所述 - 如何訪問模型hasMany Relation with where condition? - 必須在camelCase中描述關系(actions_client> actionsClient)。

在我的用法中,這對我有用:

$clients = Profile::select('id', 'name')->orderBy('initial')->whereHas('type', function ($query) {
    $query->where('slug', 'client');
})->office()->pluck('name', 'id');

你已經有$ activist的實例急切加載他們的行為,這意味着你已經知道活動家的行為因為他們已經在實例中了,所以為什么再次調用actions()而不是這樣做:

$activist->actions->count()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM