Laravel Filterung hasMany Ergebnisse

Ich habe drei Tabellen - Kampagnen, - Aktionen und-Aktivisten. Eine Kampagne hat viele Aktionen und eine Aktion gehört sowohl ein Aktivist und eine Kampagne.

Jede Aktion hat eine client_id (aus dem client_id der Kampagne, zu der es gehört), also wenn ein client ruft eine Liste von Aktivisten, Sie sollten nur diejenigen, die genommen haben, eine Aktion auf eine Ihrer Kampagnen.

Ebenso, wenn die Anzeige eines einzelnen Aktivisten, Sie sollten nur sehen, dass diese Aktionen im Zusammenhang mit Ihren Kampagnen.

Modelle

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

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

Sehe ich die folgenden:

Auf /Aktivisten-Seite, ich bin richtig sehen, nur diejenigen Aktivisten, die eine Aktion im Zusammenhang mit meiner client_id, sondern auch jeder Aktion, die Sie unternommen haben. Ebenso, count() gibt eine vollständige Zählung aller Aktivisten zu Aktionen.

Auf /Aktivisten/{id} wird die Seite richtig gibt null zurück, wenn die Aktivisten nicht ergriffen hat jegliche Handlungen im Zusammenhang mit meiner client_id, aber wo Sie haben, sehe ich wieder alle Ihrer Handlungen und eine volle Zahl.

AFL. Es ist etwas, blendend offensichtlich, dass ich bin fehlt, richtig?

Dank.

[Bearbeiten] Aktualisiert hinzufügen:

Über die client_id-filter auf beide mit und whereHas richtet die 'alle Aktionen erscheinen unabhängig' Problem, aber die Zählung Problem bleibt (und ich bin mir nicht sicher, das ist aus der Ferne der richtige Weg, um dies zu verbessern):

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);
}
vielleicht können Sie versuchen, diese github.com/fico7489/laravel-eloquent-join

InformationsquelleAutor taekni | 2014-08-24

Schreibe einen Kommentar