Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel雄辩模型扩展了其他模型_Php_Laravel - Fatal编程技术网

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()中的任何当前实现


如果有很多模型,我可能会使用trait
defaultmodulecount
作为默认计数,如果一致的话,也可能使用自定义版本,例如
ElementsModuleCount

好的,但是如何从model
UserOff
中获取一个已经处于活动状态的用户呢。我的意思是,例如
UserOff::find(10);
其中10是活动用户。你得到了一个UserOff的实例,但它没有关闭。我想这可能会让人困惑。你不会得到一个
UserOff
的实例,因为全局范围,你会通过设计得到
null