Переопределение Laravel и первые методы - PullRequest
2 голосов
/ 15 апреля 2019

Мне нужно переопределить вышеупомянутые методы, чтобы пропустить некоторые записи базы данных.Использование where не вариант, так как мне придется использовать его каждый раз, так как в базе данных есть записи, которые мне не нужны большую часть времени, и мне не разрешено удалять их из БД.Вот моя попытка сделать это:

class SomeTable extends BaseModel { 

    public static function first() {
       $query = static::query();
       $data = $query->first();
       if($data && $data->type == 'migration_type') return null;

       return $data;
    }

    public static function get() {
       $query = static::query();
       $data = $query->get();
       foreach($data as $key => $item) {
           if($item->type == 'migration_type') unset($data[$key]); 
       }

       return $data;
    }
}

Проблема с этим кодом заключается в том, что он работает только при прямом вызове модели.Если я использую некоторые другие функции, такие как where, перед get или first методами, он просто пропускает мой переопределенный метод.Каков будет правильный способ сделать это, и я должен поместить этот код в модель?

Мой вопрос не повторяется, так как в ответе на упомянутый вопрос сказано:

всезапросы, сделанные из Моделей, расширяющих вашу CustomModel, получат эти новые методы

И мне нужно переопределить эти две функции только для конкретной модели, а не для каждой в приложении, поскольку не все таблицы имеют столбец type.Вот почему я написал их в классе модели.

Ответы [ 3 ]

4 голосов
/ 15 апреля 2019

Мне нужно переопределить вышеупомянутые методы, чтобы пропустить некоторые записи базы данных.

Рассмотреть глобальную область запросов для модели.

https://laravel.com/docs/5.8/eloquent#global-scopes

Глобальные области позволяют вам добавлять ограничения ко всем запросам для данной модели.Собственная функциональность мягкого удаления Laravel использует глобальные области для извлечения только «не удаленных» моделей из базы данных.Написание собственных глобальных областей может обеспечить удобный и простой способ убедиться, что каждый запрос для данной модели получает определенные ограничения.

0 голосов
/ 15 апреля 2019

Проблема здесь в том, что метод where () в модели возвращает экземпляр QueryBuilder, где get () возвращает экземпляр Collection.

Вы должны иметь возможность переопределить методы коллекции по умолчанию с помощьюдобавление макроса вместо него и может быть сделано так ...

Collection::macro('toUpper', function () {
    return $this->map(function ($value) {
        return Str::upper($value);
    });
});

Расширение экземпляра построителя запросов не так просто, но хороший учебник существует здесь и включает переопределение приложениякласс соединения по умолчанию, что не очень хорошо, когда дело доходит до будущих обновлений.

0 голосов
/ 15 апреля 2019

Потому что после вызова там, где вы имеете дело со сборщиком баз данных, и методы этих моделей внутри вашей модели не вызываются .. о проблеме, которую вы могли бы преодолеть, используя select вместо first напрямую, поэтому будем иметь дело сстроитель ..

пример:

SomeTable::select('col1','col2')->take(1)->get();

другая вещь, переопределяющая эти методы, не очень хорошая идея, если вы работаете с другим разработчиком в том же проекте.

удачи

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...