Я работаю над приложением Laravel со многими моделями Eloquent. Эти красноречивые модели (например, «Пользователь», «Почта» и т. Д.) Также содержат множество запросов, которые только слабо связаны с моделью (часто необработанные sql).
Некоторые запросы похожи на «получить мне некоторую информацию из одной таблицы, некоторые из другой и немного информации из третьей таблицы». Теперь такие модели, как модель User, могут иметь много методов, таких как getAllUncompletedActionsForUser
или же getSessionsDurationsPerUser
, Я думаю, это нехорошо, если красноречивая модель будет иметь тысячи строк кода.
Что бы вы выбрали для разделения этих моделей, где бы вы разместили и как бы вы назвали классы, которые возвращают результаты базы данных, которые имеют дело со многими различными таблицами?
Добро пожаловать в узкое место активная запись шаблон. Вот почему так много людей называют это анти-паттерном.
Вместо того, чтобы пытаться сжать больше функциональности в том же классе, вы должны начать перемещать только-туманно, связанные с логика настойчивости в автономном режиме картографы данных.
Вроде как:
$user = App\Entity\User::find($id);
$mapper = new App\Mapper\UserActions($dbConnection);
$mapper->fetchIncompleted($users);
var_dump($user->getActions(App\Entity\User::ACTION_INCOMPLTE));
Конечно, вы, вероятно, захотите использовать IoC (если возможно) для внедрения этих картографов в данный сервис, вместо того, чтобы использовать new
оператор в каком-то случайном месте.
Рассматривали ли вы использование Черты?
Если бы это было до меня, я бы создал папку App/Traits
и есть, например, UserActions
черта, которая имеет getAllUncompletedActionsForUser()
функция.
Черта UserActions
может использоваться в любом подходящем классе / модели.