Php Laravel雄辩模型扩展了其他模型
我有一个关于扩展我自己的模型雄辩的问题 在我目前正在处理的项目中,有一个名为Php Laravel雄辩模型扩展了其他模型,php,laravel,Php,Laravel,我有一个关于扩展我自己的模型雄辩的问题 在我目前正在处理的项目中,有一个名为modules的表,其中包含项目模块列表、该模块的元素数量、添加日期等 例如: id=1;名称='用户';计数=120;日期_add='2007-05-05' 这个名为用户的实体对应于模型用户(表-用户),所以“计数”就是用户数 为了更新count,我们每天都使用脚本运行(我知道这不是一个好方法,但是…你知道) 在该脚本中是循环,在该循环中有很多if语句(每个模块1个),在if中有一个带有count的查询。根据示例,它类
modules
的表,其中包含项目模块列表、该模块的元素数量、添加日期等
例如:
id=1;名称='用户';计数=120;日期_add='2007-05-05'代码>
这个名为用户
的实体对应于模型用户
(表-用户
),所以“计数”就是用户数
为了更新count
,我们每天都使用脚本运行(我知道这不是一个好方法,但是…你知道)
在该脚本中是循环,在该循环中有很多if语句(每个模块1个),在if中有一个带有count的查询。根据示例,它类似于:
foreach($modules as $module) {
if($module['name'] == 'users') {
$count = old_and_bad_method_to_count('users', "state = 'on'");
}
}
function old_and_bad_method_to_count($table, $sql_cond) {}
所以看起来很糟糕
我需要对代码进行一点重构,因为它使用了一个危险的函数,而不是Query/Builder或elount/Model,而且看起来很糟糕
我想出了一个主意,我将使用一个模型并创建接口elementsContable
,所有没有接口的模型都将使用Model::all()->count()
,有接口的模型将使用接口方法:
foreach ($modules as $module) {
$className = $module->getModelName();
if($className) {
$modelInterfaces = class_implements($className);
if(isset($modelInterfaces[ElementsCountable::class])) {
/** @var ElementsCountable $className */
$count = $className::countModuleElements();
} else {
/** @var Model $className */
$count = $className::all()->count();
}
}
}
在方法getModelName()
中,我使用我创建的常量映射数组(表->模型),因为很多模型都有自定义表名
但是后来我意识到这是一个好方法,但是模块中有一些记录使用相同的表,例如users\u off
,它们使用与users
相同的表,但使用其他条件-state='off'
所以这让事情变得复杂了一点,有一个正确的问题:有没有一个好方法可以扩展用户并在引导时根据条件添加范围
class UserOff extends User
{
protected static function boot()
{
parent::boot();
static::addGlobalScope(function (Builder $builder) {
$builder->where('state', '=', 'off');
});
}
}
因为我担心这是否是一个好的解决方案。因为该类的所有方法都需要该作用域,如何防止方法没有GlobalScope()
,以及其他复杂情况呢?我认为创建带有额外全局作用域的UserOff
模型是一个很好的解决方案
我还认为我想要实现的解决方案将允许我做如下事情
$count=$modules->sum(函数($module){
$className=$module->getModelName();
返回$className::moduleCount();
}
我将创建一个接口modulescoountable
,该接口在每个模型上强制使用modulescoount()
方法。modulescoount()
方法将返回默认计数或countModuleElements()中的任何当前实现
如果有很多模型,我可能会使用traitdefaultmodulecount
作为默认计数,如果一致的话,也可能使用自定义版本,例如ElementsModuleCount
。好的,但是如何从modelUserOff
中获取一个已经处于活动状态的用户呢。我的意思是,例如UserOff::find(10);
其中10是活动用户。你得到了一个UserOff的实例,但它没有关闭。我想这可能会让人困惑。你不会得到一个UserOff
的实例,因为全局范围,你会通过设计得到null
。