Pregunta

tengo dos mesas en Laravel conectado con una mesa pivotante.Las dos mesas son users y roles, y la tabla dinámica se llama role_user.La tabla dinámica también contiene dos campos adicionales: start y stop.De esta manera puedo rastrear qué roles user ha tenido en el pasado.

Ahora quiero crear una consulta que obtenga todos users que actualmente tienen role_id = 3.

Primero había usado WherePivot, pero aparentemente eso es molestado.

Ahora he realizado la siguiente 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();

Pero de alguna manera recibo un error que indica que no se puede encontrar el inicio de la columna de la tabla dinámica.Pero puedo confirmar en PHPMyAdmin que la columna está ahí.

Este es el error completo:

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)

¿Alguien puede decirme si estoy haciendo algo mal o darme una pista sobre dónde debería buscar ahora?

¿Fue útil?

Solución

El error te dice que te falta el start columna en su tabla dinámica klj_role_user.Lo que debes hacer es crear la columna.Si la columna ya está allí, asegúrese de estar utilizando la base de datos correcta.

También he simplificado un poco tu consulta.Realmente no necesitas un whereHas porque no estás tratando de limitar tus roles por los usuarios asociados, sino por la identificación, que en este caso estás usando 3.A with() funcionaría perfectamente bien y wherePivot() Parece funcionar bien para mí cuando se usa junto con 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;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top