Ларавел 4:Странное поведение в магически называемых отношениях ownTo
Вопрос
У меня есть следующая модель задачи
class Task extends Eloquent {
public function user()
{
return $this->belongsTo('User');
}
}
Когда я звоню:
$task = Task::with('user')->first();
Я получаю следующий ожидаемый результат:
{
id : 10,
user_id : 20,
user : {
id : 20
}
}
И следующий ожидаемый журнал запросов:
select `tasks`.* from `tasks` limit 1;
select * from `users` where `users`.`id` in (20);
Однако, когда я волшебным образом настраиваю свои отношения, отношения ownTo разрываются:
class Task extends Eloquent {
public function __call($name, $arguments)
{
if ($name === 'user')
return $this->belongsTo('User');
return parent::__call($name, $arguments);
}
}
Я получаю следующий сломанный результат:
{
id : 10,
user_id : 20,
user : null // USER IS MISSING!
}
И следующий сломанный журнал запросов:
select `tasks`.* from `tasks` limit 1;
select * from `users` where `users`.`id` in (0); // NOTE THE 0 INSTEAD OF 20
Я не получаю никаких ошибок.Я пробовал то же самое с belongsToMany
, но это работает отлично.
По какой-то причине число «20» не передается в отношение ownTo.Поэтому я ожидаю, что __call() запускает новый экземпляр запроса, но я не понимаю, почему?
Я записал случаи запуска __call(), но, за исключением «пользовательского» метода, он, похоже, вообще не запускается.Насколько мне известно, тогда это не может быть проблемой.
Решение
Вероятно, это потому, что Laravel использует имя метода, внутри которого он находится, в качестве внешнего ключа по умолчанию.Попробуй это:
return $this->belongsTo('User', 'user_id');