我正在使用许多Eloquent模型的Laravel应用程序。这些雄辩的模型(例如User,Post等)也包含许多只与模型松散连接的查询(通常是原始sql)。
有些问题是,“从一张桌子获取一些信息,从另一张桌子获取一些信息,从第三张桌子获取一些信息”。现在像User模型这样的模型可以有很多方法,如getAllUncompletedActionsForUser
或getSessionsDurationsPerUser
。我认为,如果一个雄辩的模型将拥有数千行代码,那就不好了。
您对拆分这些模型有什么看法,您会在哪里放置?如何命名返回处理许多不同表的数据库结果的类?
答案 0 :(得分:2)
欢迎来到active record模式的瓶颈。这就是为什么这么多人把它称为反模式的原因。
您应该开始将仅与模糊相关的持久性逻辑移动到独立的data mappers,而不是尝试在同一个类中挤出更多功能。
有点像这样:
$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
运算符。
答案 1 :(得分:0)
您是否考虑过使用Traits?
如果由我决定,我会创建一个文件夹App/Traits
并拥有一个UserActions
特征,该特征具有getAllUncompletedActionsForUser()
功能。
特征UserActions
可用于任何适当的类/模型。