Могу ли я использовать обозначение `::class` в функциях модели - Laravel
Я чищу код в моем приложении. Кажется у меня неправильное представление о ::class
нотации.
Хотя в моем config/app.php
Заявленные провайдеры могут быть преобразованы из, скажем так 'igaster\laravelTheme\themeServiceProvider',
в это igaster\laravelTheme\themeServiceProvider::class,
Я не могу сделать то же самое для объектов в моделях.
Например, у меня есть
public function relateds()
{
return $this->hasMany('App\Models\Related', 'item_id')->Where('itemkind', '=', 'capacitytypes', 'and')->Where('status', '!=', '2');
}
после преобразования в
public function relateds()
{
return $this->hasMany(App\Models\Related::class, 'item_id')->where('itemkind', '=', 'capacitytypes')->where('status', '!=', '2');
}
Я получаю ошибку
FatalThrowableError in Model.php line 918:
Class 'App\Models\App\Models\Action' not found
Означает ли это, что я не могу использовать обозначения в моделях, или я делаю что-то неправильно?
1 ответ
Пространства имен ведут себя в некоторой степени как пути к файлам в этом контексте, поскольку, когда вы ссылаетесь на один из них в своем коде, вы можете ссылаться на них относительно (относительно текущего пространства имен) или абсолютно (полное пространство имен).
Когда вы находитесь в файле с таким пространством имен, как этот, если вы пропустите ведущий \
характер, то вы ссылаетесь относительно. Вот почему он ищет App\Models\App\Models\Action
,
Файл config/app.php
не является пространством имен, и поэтому предполагается, что любые предоставленные вами пространства имен относятся к корневому пространству имен, поэтому вам не нужен ведущий \
персонаж.
Для справки, есть несколько вещей, которые вы могли бы сделать, чтобы решить вашу проблему здесь.
Во-первых, как предлагается в комментариях, вы можете поставить
\
в начале так становится:public function relateds() { return $this->hasMany(\App\Models\Related::class, 'item_id')->where('itemkind', '=', 'capacitytypes')->where('status', '!=', '2'); }
Во-вторых, вы могли бы
use
класс в верхней части вашего файла, сразу после объявления пространства имен, а затем опустите полное пространство имен при определении ваших отношений, например так:<?php namespace App\Models; use App\Models\Related; class Action extends Model { // ... public function relateds() { return $this->hasMany(Related::class, 'item_id')->where('itemkind', '=', 'capacitytypes')->where('status', '!=', '2'); }
И, наконец, проще, так как ваш
Related
а такжеAction
модели находятся в одном и том жеApp\Models
пространство имен, вы можете полностью опустить пространство имен при определении ваших отношений, без необходимостиuse
это наверху. Таким образом, вы бы в конечном итоге с этим:public function relateds() { return $this->hasMany(Related::class, 'item_id')->where('itemkind', '=', 'capacitytypes')->where('status', '!=', '2'); }