Laravel 4: Comportamiento extraño en la llamada de la relación perteneciente.
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.
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');