Question

J'ai deux tables dans Laravel connecté à un tableau croisé dynamique.Les deux tableaux sont users et roles, et le tableau croisé dynamique s'appelle role_user.Le tableau croisé dynamique contient également deux champs supplémentaires : start et stop.De cette façon, je peux suivre quels rôles un user a eu dans le passé.

Maintenant, je veux créer une requête qui récupère tout users qui ont actuellement role_id = 3.

J'avais d'abord utilisé WherePivot, mais apparemment c'est buggé.

J'ai maintenant fait la requête suivante en utilisant 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();

Mais d'une manière ou d'une autre, j'obtiens une erreur indiquant que le début de la colonne du tableau croisé dynamique est introuvable.Mais je peux confirmer dans PHPMyAdmin que la colonne est là.

C'est toute l'erreur :

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)

Quelqu'un peut-il me dire si je fais quelque chose de mal ou me donner une idée de l'endroit où je devrais chercher maintenant ?

Était-ce utile?

La solution

L'erreur vous indique qu'il vous manque le start colonne dans votre tableau croisé dynamique klj_role_user.Ce que vous devez faire est de créer la colonne.Si la colonne est déjà là, assurez-vous que vous utilisez la bonne base de données.

J'ai également simplifié un peu votre requête.Vous n'avez pas vraiment besoin d'un whereHas parce que vous n'essayez pas de limiter vos rôles par les utilisateurs associés, mais par l'identifiant, que vous utilisez dans ce cas 3.UN with() fonctionnerait parfaitement bien et wherePivot() semble fonctionner bien pour moi lorsqu'il est utilisé conjointement avec 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;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top