我尝试将项目从yii1迁移到yii2。 当我还在使用Yii1时,我有一些模型功能,其中就是生成id uniq函数,如下所示:
public static function generateID($tableName, $modelName) {
$dateNow = date("Ymd");
$checkLastID = $modelName::findBySql(
"SELECT SUBSTR(MAX(id),-4) AS id FROM $tableName WHERE id LIKE '%$dateNow%'"
)->one();
$lastNumber = (int)substr($checkLastID["id"], 8,4);
if($checkLastID["id"] == '') {
$id = $dateNow.sprintf("%04s", 1);
} else {
$lastNumber = $checkLastID["id"];
$lastNumber++;
if($lastNumber < 10) $id = $dateNow.sprintf("%04s", $lastNumber);
elseif($lastNumber < 100) $id = $dateNow.sprintf("%04s", $lastNumber);
elseif($lastNumber < 1000) $id = $dateNow.sprintf("%04s", $lastNumber);
elseif($lastNumber < 10000) $id = $dateNow.sprintf("%04s", $lastNumber);
else $id = $lastNumber;
}
return $id;
}
我从控制器访问这个函数:
$model->id = Helper::generateID('table_name', 'ModelName');
而且,当我想要创建数据时显示错误:
<pre>PHP Fatal Error 'yii\base\ErrorException' with message 'Class 'ModelName' not found'
in C:\xampp\htdocs\kampunginggrispare.com\common\models\Helper.php:61
Stack trace:
#0 [internal function]: yii\base\ErrorHandler->handleFatalError()
#1 {main}</pre>
但是,如果我改变了
$checkLastID = $modelName::findBySql("SELECT SUBSTR(MAX(id),-4) AS id FROM $tableName WHERE id LIKE '%$dateNow%'")->one();
是:
$checkLastID = ModelName::findBySql("SELECT SUBSTR(MAX(id),-4) AS id FROM table_name WHERE id LIKE '%$dateNow%'")->one();
这是有效的,但是当我使用上面的函数
时,它不起作用在Yii1中,不是错误,而是Yii2中的错误
任何人都可以帮助我吗?
谢谢...
答案 0 :(得分:1)
尝试在Helper
类中使用之前加载$ ModelName。你可以
...
$dateNow = date("Ymd");
$className = '\common\models\\' . $modelName; // replace this with your model's namespace
$checkLastID = $className::findBySql(
"SELECT SUBSTR(MAX(id),-4) AS id FROM $tableName WHERE id LIKE '%$dateNow%'"
)->one();
....
或者简单地将您的助手放在具有$ModelName
的相同名称空间中(不太推荐)。我仍然不明白你Helper
课程的目的。
答案 1 :(得分:0)
Yii2没有找到ModelName
课程。
请阅读有关升级的更多信息:Upgrading from Version 1.1: Namespace和Yii2 autoloaders。