Pregunta

Tengo el siguiente modelo de tarea

class Task extends Eloquent {
    public function user()
    {
        return $this->belongsTo('User');
    }
}

cuando llamo:

$task = Task::with('user')->first();

Obtengo el siguiente resultado esperado:

{
    id      : 10,
    user_id : 20,
    user    : {
        id      : 20
    }
}

y la siguiente consulta esperada:

select `tasks`.* from `tasks` limit 1;
select * from `users` where `users`.`id` in (20);

Sin embargo, cuando pongo mi relación de manera mágica, la relación de perteneciente se rompe:

class Task extends Eloquent {
    public function __call($name, $arguments)
    {
        if ($name === 'user')
            return $this->belongsTo('User');

        return parent::__call($name, $arguments);
    }
}

Obtengo el siguiente resultado roto:

{
    id      : 10,
    user_id : 20,
    user    : null // USER IS MISSING!
}

y el siguiente registro de consulta roto:

select `tasks`.* from `tasks` limit 1;
select * from `users` where `users`.`id` in (0); // NOTE THE 0 INSTEAD OF 20

No recibo ningún error.He intentado lo mismo con belongsToMany, pero eso funciona perfectamente.

Por alguna razón, el '20' no se pasa a la relación de pertenencia.Por lo tanto, espero que el __ call () esté disparando una nueva instancia de consulta, pero no entiendo por qué?

He registrado las veces __Call () se enciende, pero además del método 'Usuario', no parece ser despedido en absoluto.Entonces, con el conocimiento que no puede ser el problema entonces.

¿Fue útil?

Solución

Es probable que Laravel usa el nombre del método que está dentro, como la clave externa predeterminada.Prueba esto:

return $this->belongsTo('User', 'user_id');

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top