Filtrer sur le tableau croisé dynamique Laravel
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 ?
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;
}