Laravel4 :Comportement étrange sur la relation d'appartenance appelée par magie
Question
J'ai le modèle de tâche suivant
class Task extends Eloquent {
public function user()
{
return $this->belongsTo('User');
}
}
Quand j'appelle :
$task = Task::with('user')->first();
J'obtiens le résultat attendu suivant :
{
id : 10,
user_id : 20,
user : {
id : 20
}
}
Et le journal de requête attendu suivant :
select `tasks`.* from `tasks` limit 1;
select * from `users` where `users`.`id` in (20);
Cependant, lorsque je définis ma relation de manière magique, la relation AppartientTo se rompt :
class Task extends Eloquent {
public function __call($name, $arguments)
{
if ($name === 'user')
return $this->belongsTo('User');
return parent::__call($name, $arguments);
}
}
J'obtiens le résultat cassé suivant :
{
id : 10,
user_id : 20,
user : null // USER IS MISSING!
}
Et le journal de requête cassé suivant :
select `tasks`.* from `tasks` limit 1;
select * from `users` where `users`.`id` in (0); // NOTE THE 0 INSTEAD OF 20
Je n'obtiens aucune erreur.J'ai essayé la même chose avec belongsToMany
, mais cela fonctionne parfaitement.
Pour une raison quelconque, le « 20 » n'est pas transmis à la relation AppartientTo.Par conséquent, je m'attends à ce que __call() lance une nouvelle instance de requête, mais je ne comprends pas pourquoi ?
J'ai enregistré les fois où __call() est déclenché, mais à part la méthode 'user', il ne semble pas du tout être déclenché.Donc, à ma connaissance, cela ne peut pas être le problème.
La solution
C'est probablement parce que Laravel utilise le nom de la méthode dans laquelle il se trouve comme clé étrangère par défaut.Essaye ça:
return $this->belongsTo('User', 'user_id');