Laravel 4: strano comportamento su magicamente chiamato relazione di appartamento
Domanda
Ho il seguente modello di attività
class Task extends Eloquent {
public function user()
{
return $this->belongsTo('User');
}
}
.
Quando chiamo:
$task = Task::with('user')->first();
.
ottengo il seguente risultato atteso:
{
id : 10,
user_id : 20,
user : {
id : 20
}
}
.
e il seguente registro di query previsto:
select `tasks`.* from `tasks` limit 1;
select * from `users` where `users`.`id` in (20);
.
Tuttavia, quando impostare la mia relazione in modo magico, la relazione di apparizione si rompe:
class Task extends Eloquent {
public function __call($name, $arguments)
{
if ($name === 'user')
return $this->belongsTo('User');
return parent::__call($name, $arguments);
}
}
.
ottengo il seguente risultato interrotto:
{
id : 10,
user_id : 20,
user : null // USER IS MISSING!
}
.
e il seguente interrogatorio rotto:
select `tasks`.* from `tasks` limit 1;
select * from `users` where `users`.`id` in (0); // NOTE THE 0 INSTEAD OF 20
.
Non ottengo alcun errore.Ho provato la stessa cosa con belongsToMany
, ma funziona perfettamente.
Per qualche motivo il '20' non è passato alla relazione di apparizione.Pertanto mi aspetto che il __call () sta spaventando una nuova istanza di query, ma non capisco perché?
Ho registrato i tempi __call () viene licenziato, ma oltre al metodo "utente", non sembra affatto licenziato.Quindi a mia conoscenza che non può essere il problema allora.
Soluzione
Questo è probabilmente perché la laurave utilizza il nome del metodo che è all'interno come chiave esterna predefinita.Prova questo:
return $this->belongsTo('User', 'user_id');
.