Laravel4 :Comportement étrange sur la relation d'appartenance appelée par magie

StackOverflow https://stackoverflow.com//questions/20018719

  •  21-12-2019
  •  | 
  •  

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.

Était-ce utile?

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');
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top