Ларавел 4:Странное поведение в магически называемых отношениях ownTo

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

  •  21-12-2019
  •  | 
  •  

Вопрос

У меня есть следующая модель задачи

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');
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top