У меня сейчас на основной работе куча реп-помоек под каждую модель, но сколько я ни спрашивал за эту тему, все в голос говорят что они нахрен не нужны
ну я много раз слышал что репозитории излишни, по факту так и есть это просто класс куда ты выбрасываешь методы модели и юзаешь их в модели потом, но мне нравится в плане того что модель чище выглядит
Так конечно, особенно если работаешь с моделями Eloquent, в результате нарушаешь сам паттерн... У тебя нет возможности подменить реализацию репозитория другим, например вынести пользователей из БД, в API. Потому что по коду, учитывая Eloquent, скорее всего где-то встречается User::find, не говоря про штатные менеджеры типо AuthManager'а, который вообще на прямую работает с моделью, и врядли его кто-то переписывал на работу с репозиторием 🙂
Ну согласись, что в котексте модели, как сущности эти методы не имеют никакого отношения
Это другой вопрос) я говорил про то, почему репы не нужны в ларавель при такой работе. В крайнем случае спокойно Query модели подойдут. Чтобы упаковать скоупы, если их прям тьма, при этом сохранить контекст модели.
что за query модели? в доке есть?
Вот же пример - https://t.me/octobercms_rus/256934
а почему Query наследует модель а не на оборот? как тогда сторить запрос
Потому что это модель для запросов. Якикз которую ты делаешь запросы, но получаешь наследника модели. Что соответсвует возможностям декларирования и консистенции методов модели.
не понял( можешь пожалуйста доку дать или пример использования вот я вынес к примеру класс UsersQuery { public function scopeActive() {} } и я могу все также использовать в запросе $user->active()
App/Models/User - модель пользователя App/Models/Queries/UserQuery - модель наследник для запросов App/Models/User: class User extends Model { ... public function isActive(): bool { return $this->is_activated === true; } .... } App/Models/Queries/UserQuery: use App/Models/User as UserModel; class UserQuery extends UserModel { protected function scopeActive(Builder $query): void { $query->where('is_activated', true); } } Использование: class Example { public function getFirstUser(): User // see declare to User model. { return UserQuery::active()->first(); } } .... $example = new Example; var_dump($example->getFirstUser()); // UserQuery object var_dump($example->getFirstUser()->isActive()); // true, method from User Model.
спасибо большое
а, так это мне не поможет выходит, мне весь код лопатить и заменять использование модели на Query
Можешь плавно съезжать, выводя старые методы в @deprecated, чтобы IDE подсвечивала, что этот метод больше не стоит использовать.
Та репа именно так и пишется - это не абстракция НАД моделью, это просто слой работы с БД
пфф, я запутался, у меня модель я хочу скопы из неё куда-то деть, методы большие, думал в репозиторий, но как правильно разрешить зависимости репозитория, я не особо знаю,достаточно ли того что я сделал, но мне не очень нравится создание обьекта в конструкторе🤔
Тогда, юзай код который Вова предлагает)
Он более каноничен :D, да и старые методы можно задепрекейтить. Но надо приучить себя для запросов всегда использовать Query модель 🙂
Хотя нет, главное правило - всегда юзай код, который Владимир предлагает)
а если у меня этот скоп используется вот так: self::query()->with($with)->bySlug($slug) где self - ItemModel, и также есть скопы, которые отвечают за фильтры в админ панели, ого как все запутано тут в октябре)
Обсуждают сегодня