Laravel: создание общей функции для всех моделей - PullRequest
1 голос
/ 03 апреля 2020

В моем приложении laravel (7.x) у меня есть общая функциональность для отображения количества всех активных и неактивных записей во всех модулях. Поэтому я обязан повторять одну и ту же функциональность на каждом модуле.

Например: у Device, DeviceType, DeviceCompany, etc моделей один и тот же метод с именем _getTotal, и везде метод _getTotal выполняет одну и ту же работу.

Device. php

class Device extends Model
{
    protected $table = 'devices';

    ...

    public function _getTotal($status = \Common::STATUS_ACTIVE)
    {
        return self::where([
            'status' => $status
        ])->count() ?? 0;
    }
}

DeviceType. php

class DeviceType extends Model
{
    protected $table = 'device_types';

    ...

    public function _getTotal($status = \Common::STATUS_ACTIVE)
    {
        return self::where([
            'status' => $status
        ])->count() ?? 0;
    }
}

Я пытался поместить этот метод в Base Model, но я думаю, что это не может быть хорошая практика. Я прав ..?
Есть ли способ сделать этот метод _getTotal общим методом для всех модулей ..?

Ответы [ 3 ]

5 голосов
/ 03 апреля 2020

Вы можете переместить этот метод в черту и включить ее вместо всех классов, которым нужен этот метод.

trait DeviceStatusTotal
{
    public function _getTotal($status = \Common::STATUS_ACTIVE)
    {
        return self::where([
            'status' => $status
        ])->count() ?? 0;
    }
}

DeviceType. php

class DeviceType extends Model
{
    use DeviceStatusTotal;

    protected $table = 'device_types';

    // ...
}
0 голосов
/ 03 апреля 2020

Или вы можете создать расширенный класс Model по умолчанию, и ваши модели будут расширяться из этого пользовательского класса (который имеет вашу пользовательскую функцию)

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

Вы можете использовать laravel Глобальные области действия: https://laravel.com/docs/5.7/eloquent#global -области

Еще одна причина использования черт и использования в моделях, а также метод для локальной области видимости:

public function scopePopular($query) {
    return $query->where('votes', '>', 100);
}
...