Лучшая практика для создания пользовательского запроса в модели - PullRequest
1 голос
/ 19 апреля 2020

У меня есть модель с именем «Rate» и связанный контроллер с именем «RateController». Если вы хотите сделать пользовательский запрос в модели Rate, мы могли бы использовать локальную область или функцию stati c, например:

, используя функцию stati c в модели Rate:

public static function avgerage($type, $id)
{
    return static::where('rateble_type', $type)
                ->where('rateble_id', $id)
                ->avg('star');
}

используя локальную область видимости в модели Rate:

public function scopeAverageRate($type, $id, $query)
{
    return $query->where('rateble_type', $type)
                 ->where('rateble_id', $id)
                 ->avg('star');
}

и, наконец, мы вызываем один из вышеперечисленных методов в контроллере.

Вопрос в том, какой метод лучше всего подходит? использование локальной области или определение функции stati c в модели?

Спасибо.

Ответы [ 3 ]

2 голосов
/ 19 апреля 2020

Более подробно, если вы создаете экземпляр Model и используете на нем method и не заботитесь о состоянии этого конкретного экземпляра, вы должны использовать методы stati c. Количество случаев, когда эта ситуация действительно применима, довольно редко. Большую часть времени это будет нестати c, поэтому большую часть времени вы будете использовать local scope.

. При создании запроса спросите себя, относится ли это к поведению из Model? Если так, то используйте локальную область видимости. Если это относится к концепции из Model, тогда используйте stati c.

1 голос
/ 19 апреля 2020
  • Не используйте методы stati c, если вам нужен построитель запросов.

  • Методы Stati c отлично подходят для выполнения полных запросов и возврата результаты.

Подробнее о Stati c методах на модели Eloquent Это поможет.

0 голосов
/ 19 апреля 2020

Поскольку контроллер должен отвечать только за обработку запроса и отправку ответа, я предлагаю не делать их «толстыми» при реализации запросов (это ответственность уровня модели).

Я бы сделал следующее:

class MyModel 
{
     public function average($type, $id)
     {
         // query implementation
     }
}

class MyController 
{
    public function index($type, $id)
    {
        $model = new MyModel();
        $average = $model->average($type, $id);
        // return response
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...