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);
}
InformationsquelleAutor taekni | 2014-08-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hab ich gelöst jetzt, aber für Referenz:
Diesem, offensichtlich im Nachhinein, ignoriert von den vorherigen Abfragen und einfach zählt Daten zurückgegeben, die von den actions () - Methode definiert, in der Aktivist-Modell.
Ich soll eine Alternative Methode in das Modell ein, das die entsprechende wo-Funktion, etwa so:
Bedeutung der Graf könnte dann aufgerufen werden mit:
für eine einzelne Kampagne und
auf dem index. Ich hatte vorher ausprobiert, aber wie hier beschrieben - Wie Sie access-Modell hasMany Beziehung mit where-Bedingung? - Beziehungen müssen beschrieben werden in camelCase (actions_client > actionsClient).
InformationsquelleAutor taekni
In meiner Nutzung dieser arbeitete für mich:
InformationsquelleAutor Sinan Eldem
Haben Sie bereits die Instanz von $Aktivist eager loading Ihre Aktionen, die Bedeutung, die Sie bereits wissen, die Aktionen der Aktivisten beschreiben, weil Sie bereits in der Instanz, also warum rufen Aktionen() wieder statt nur dabei:
InformationsquelleAutor GaimZz