Вызов метода модели как свойства, а не функции

Недавно начал изучать Laravel и наткнулся на кусок кода, который вызвал у меня головную боль и нуждался в объяснении, почему это так.

А именно, я установил базовое приложение laravel, в моей модели User (класс стандартной модели) я создал метод как таковой:

 public function projects() {
    return $this->hasMany(Project::class, 'project_owner_id');
}

Достаточно просто, у меня есть модель Project, у нее есть собственная таблица, в которой есть столбец и внешний ключ project_owner_id, и я просто ссылаюсь на отношения между двумя моделями.

Теперь в моем контроллере, когда я пытаюсь получить доступ к этому методу и получить все проекты, принадлежащие вошедшему в систему пользователю, я получаю сообщение об ошибке:

$projects = auth()->user()->projects();

Мне потребовалось некоторое время, чтобы понять, что ошибка была вызвана мной при вызове projects как функции, а не свойства, после того как я реорганизовал код как таковой:

$projects = auth()->user()->projects;

все было хорошо и работало правильно, я получал проекты, которые принадлежали авторизованному пользователю.

Мои вопросы: может ли кто-нибудь объяснить, почему это так, почему это не сработало, когда я попытался вызвать метод projects как функцию?


person lordZ3d    schedule 08.01.2020    source источник
comment
$projects = auth()-›user()-›projects()-›get();   -  person Palak Jadav    schedule 08.01.2020
comment
auth()->user()->projects() возвращает объект отношения, а auth()->user()->projects возвращает результат отношения. Полный ответ вы найдете по ссылке выше.   -  person Abdurrahman    schedule 08.01.2020


Ответы (1)


Отношения Eloquent определяются как методы в ваших классах моделей Eloquent.

public function projects() {
    return $this->hasMany(Project::class, 'project_owner_id');
}

Как только отношение определено, мы можем получить связанную запись, используя динамические свойства Eloquent. Динамические свойства позволяют вам обращаться к методам отношений, как если бы они были свойствами, определенными в модели:

auth()->user()->projects;

Определение отношений как методов обеспечивает мощные возможности связывания методов и запросов. Например, мы можем связать дополнительные ограничения для этого отношения projects:

auth()->user()->projects()->where("status", 1)->get();
person Surender Singh Rawat    schedule 08.01.2020