Filtern Sie nach der Laravel-Pivot-Tabelle
Frage
Ich habe zwei Tische drin Laravel
verbunden mit einem Pivot-Tisch.Die beiden Tische sind users
Und roles
, und die Pivot-Tabelle wird aufgerufen role_user
.Die Pivot-Tabelle enthält außerdem zwei zusätzliche Felder: start
Und stop
.Auf diese Weise kann ich nachverfolgen, welche Rollen a user
hatte in der Vergangenheit.
Jetzt möchte ich eine Abfrage erstellen, die alles abruft users
Wer hat derzeit role_id = 3
.
Zuerst hatte ich verwendet WherePivot
, aber anscheinend ist das so verwanzt.
Ich habe nun folgende Abfrage durchgeführt mit Eloquent
:
Role::with('User')
->where('id', '=', '3')
->where('role_user.start', '<', date('Y-m-d'))
->where('role_user.stop', '>', date('Y-m-d'))
->whereHas('users', function($q){
$q->where('firstname', 'NOT LIKE', '%test%');
})
->get();
Aber irgendwie erhalte ich die Fehlermeldung, dass der Spaltenanfang der Pivot-Tabelle nicht gefunden werden kann.Aber ich kann es bestätigen PHPMyAdmin
dass die Säule da ist.
Das ist der gesamte Fehler:
Illuminate \ Database \ QueryException
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'klj_role_user.start' in 'where clause' (SQL: select * from `klj_roles` where `id` = 3 and `klj_role_user`.`start` < 2014-06-02 and `klj_role_user`.`stop` > 2014-06-02 and (select count(*) from `klj_users` inner join `klj_role_user` on `klj_users`.`id` = `klj_role_user`.`user_id` where `klj_role_user`.`role_id` = `klj_roles`.`id` and `firstname` NOT LIKE %test%) >= 1)
Kann mir jemand sagen, ob ich etwas falsch mache oder mir einen Hinweis geben, wo ich jetzt suchen sollte?
Lösung
Der Fehler sagt Ihnen, dass Ihnen das fehlt start
Spalte in Ihrer Pivot-Tabelle klj_role_user
.Sie sollten lediglich die Spalte erstellen.Wenn die Spalte bereits vorhanden ist, stellen Sie sicher, dass Sie die richtige Datenbank verwenden.
Ich habe Ihre Abfrage auch ein wenig vereinfacht.Du brauchst nicht wirklich einen whereHas
weil Sie nicht versuchen, Ihre Rollen durch die zugeordneten Benutzer einzuschränken, sondern durch die ID, die Sie in diesem Fall verwenden 3
.A with()
würde vollkommen gut funktionieren und wherePivot()
Scheint bei mir in Verbindung mit gut zu funktionieren with()
.
$role = Role::with(array('users' => function($q)
{
$q->wherePivot('start', '>', date('Y-m-d H:i:s'));
$q->wherePivot('stop', '<', date('Y-m-d H:i:s'));
$q->where('firstname', 'NOT LIKE', '%test%');
}))->find(3);
foreach($role->users as $user) {
echo $user->firstname;
}