Laravel4:Comportamento estranho no relacionamento magicamente chamado de "pertenceTo"
Pergunta
Eu tenho o seguinte modelo de tarefa
class Task extends Eloquent {
public function user()
{
return $this->belongsTo('User');
}
}
Quando eu ligo:
$task = Task::with('user')->first();
Obtenho o seguinte resultado esperado:
{
id : 10,
user_id : 20,
user : {
id : 20
}
}
E o seguinte log de consulta esperado:
select `tasks`.* from `tasks` limit 1;
select * from `users` where `users`.`id` in (20);
No entanto, quando eu defino meu relacionamento de uma forma mágica, o relacionamento pertence a se rompe:
class Task extends Eloquent {
public function __call($name, $arguments)
{
if ($name === 'user')
return $this->belongsTo('User');
return parent::__call($name, $arguments);
}
}
Eu recebo o seguinte resultado quebrado:
{
id : 10,
user_id : 20,
user : null // USER IS MISSING!
}
E o seguinte log de consulta quebrado:
select `tasks`.* from `tasks` limit 1;
select * from `users` where `users`.`id` in (0); // NOTE THE 0 INSTEAD OF 20
Não recebo nenhum erro.Eu tentei a mesma coisa com belongsToMany
, mas isso funciona perfeitamente.
Por alguma razão, o '20' não é passado para o relacionamento pertence a.Portanto, espero que __call() esteja iniciando uma nova instância de consulta, mas não entendo por quê.
Eu registrei as vezes que __call() foi disparado, mas além do método 'user', ele não parece ter sido disparado.Então, que eu saiba, esse não pode ser o problema.
Solução
Provavelmente porque o Laravel usa o nome do método dentro dele como chave estrangeira padrão.Experimente isto:
return $this->belongsTo('User', 'user_id');