php - события - where laravel ru




Методы пользовательской модели Laravel (2)

Всякий раз, когда я добавляю дополнительную логику для моделей 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 magic, но как я могу заставить его распознать мои собственные функции в модели?

Вероятно, лучший пример над «сортировкой» - это если мне нужно было выполнить вычисление или алгоритм на части данных:

$validSPG = Chemical::isValidSpecificGravity(-1.43);

Для меня имеет смысл, чтобы что-то подобное было в модели, поскольку оно является специфичным для домена.


Мой вопрос находится на более фундаментальном уровне, например, почему все () доступны через фасад?

Если вы посмотрите на Laravel Core - все () на самом деле является статической функцией

public static function all($columns = array('*'))

У вас есть два варианта:

public static function getAllSortedByMake()
{
    return Car::where('....')->get();
}

или

public function scopeGetAllSortedByMake($query)
{
    return $query->where('...')->get();
}

Оба позволят вам сделать

Car::getAllSortedByMake();

для лучшего динамического кода, вместо использования имени класса модели «Автомобиль»,

просто используйте «статические» или «я»,

public static function getAllSortedByMake()
{
    //to return "Illuminate\Database\Query\Builder" class object you can add another where as you want
    return static::where('...');

    //or return already as collection object
    return static::where('...')->get();
}




facade