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?

War es hilfreich?

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;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top