Всякий раз, когда я добавляю дополнительную логику к моделям Eloquent, мне приходится делать его static
методом (т.е. менее чем идеальным), чтобы вызывать его из фасада модели. Я много пытался найти, как это сделать правильно, и почти все результаты говорят о создании методов, которые возвращают части интерфейса Query Builder. Я пытаюсь понять, как добавить методы, которые могут возвращать что угодно и вызываться с использованием фасада модели.
Например, допустим, у меня есть модель с именем Car
, и я хочу получить их все:
$cars = Car::all();
Отлично, за исключением этого момента, допустим, я хочу отсортировать результат в многомерный массив, сделав так, чтобы мой результат выглядел так:
$cars = array(
'Ford' => array(
'F-150' => '...',
'Escape' => '...',
),
'Honda' => array(
'Accord' => '...',
'Civic' => '...',
),
);
Взяв этот теоретический пример, я испытываю искушение создать метод, который можно было бы назвать так:
$cars = Car::getAllSortedByMake();
На мгновение забудем ужасное имя метода и тот факт, что он тесно связан со структурой данных. Если я сделаю в модели такой метод:
public function getAllSortedByMake()
{
// Process and return resulting array
return array('...');
}
И, наконец, вызовите его в моем контроллере, я получу это исключение:
Нестатический метод Car :: getAllSortedByMake () не должен вызываться статически, если $ this из несовместимого контекста
TL; DR: как добавить настраиваемую функциональность, которая имеет смысл присутствовать в модели, не делая ее статическим методом и не вызывая ее с помощью фасада модели?
Редактировать:
Это теоретический пример. Возможно, перефразировка вопроса имела бы больше смысла. Почему некоторые нестатические методы, такие как all()
или which()
, доступны на фасаде модели Eloquent, но не добавляются в модель дополнительные методы? Это означает, что используется магический метод __call
, но как я могу заставить его распознавать мои собственные функции в модели?
Вероятно, лучший пример по сравнению с «сортировкой» - это если мне нужно было запустить вычисление или алгоритм для фрагмента данных:
$validSPG = Chemical::isValidSpecificGravity(-1.43);
Для меня имеет смысл включить что-то подобное в модель, поскольку это зависит от предметной области.
manufacturers
иmodels
, поэтомуmanufacturers
содержит Ford, Honda и т. Д. Иmodels
сmanufacturer_id
, связывающимmodel
сmanufacturer
и содержащим F-150, Escape, Accord, Civic и т. Д. - person Mark Baker   schedule 14.05.2014all()
доступен через фасад? Это не статический метод, что означает, что используется магический метод__call
. Из-за этого, почемуarbitraryMethodICreate()
недоступен? - person Jeremy Harris   schedule 14.05.2014Illuminate\Database\Eloquent\Model
,all
- статический метод - person Jeff Lambert   schedule 14.05.2014all()
фактически является статическим методом наModel
, и__call
в этой ситуации не вызывается. В классеModel
есть больше статических методов, а также другие, которые вы можете использовать так, какModel::method()
обрабатываются__callStatic
, затем__call
магическими методами и передаются в классEloquent Builder
. - person Jarek Tkaczyk   schedule 14.05.2014