O filtro no laravel de tabela dinâmica
Pergunta
Eu tenho duas tabelas no Laravel
conectado com uma tabela dinâmica.As duas tabelas são users
e roles
, e a tabela dinâmica é chamado de role_user
.A tabela dinâmica contém também dois campos adicionais: start
e stop
.Dessa forma posso acompanhar as quais as funções de um user
teve no passado.
Agora eu quero criar uma consulta que obtém todos os users
que atualmente têm role_id = 3
.
Primeiro eu tinha usado WherePivot
, mas, aparentemente, que é escutas.
Eu agora fez a seguinte consulta usando 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();
Mas de alguma forma eu estou recebendo um erro que a coluna de início da tabela dinâmica não pode ser encontrado.Mas posso confirmar em PHPMyAdmin
que a coluna está lá.
Esta é a totalidade de erro:
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)
Alguém pode me dizer se estou fazendo algo de errado ou me dar uma dica de onde eu deveria estar procurando agora?
Solução
O erro está dizendo que você está ausente o start
coluna na sua tabela dinâmica klj_role_user
.O que você deve fazer é criar a coluna.Se a coluna já está lá, garantir que você está usando o banco de dados correto.
Eu também simplificou sua consulta um pouco.Você realmente não precisa de um whereHas
porque você não está tentando limitar suas funções pelos usuários associados, mas pelo id, que neste caso, você está usando 3
.Um with()
funcionaria perfeitamente bem e wherePivot()
parece estar funcionando bem para mim quando usado em conjunto com 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;
}