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.

È stato utile?

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');
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top