尝试使用Yii应用数据库迁移时,我遇到了新问题。
首先我用这个创建一个新的迁移:: ./yiic migrate create tr
这给了我以下输出。
Yii Migration Tool v1.0(基于Yii v1.1.14)
创建新迁移'/var/www/html/Trackstar/protected/migrations/m130921_101251_tr.php'? (是|否)[否]:y 新迁移成功创建。
这表明我已经创建了一个新的迁移。
现在我在up()和down()中添加了必要的ddl。这是它的外观。
<?php
class m130921_101251_tr extends CDbMigration {
public function up() {
//create the issue table
$this->createTable('tbl_issue', array(
'id' => 'pk',
'name' => 'string NOT NULL',
'description' => 'text',
'project_id' => 'int(11) DEFAULT NULL',
'type_id' => 'int(11) DEFAULT NULL',
'status_id' => 'int(11) DEFAULT NULL',
'owner_id' => 'int(11) DEFAULT NULL',
'requester_id' => 'int(11) DEFAULT NULL',
'create_time' => 'datetime DEFAULT NULL',
'create_user_id' => 'int(11) DEFAULT NULL',
'update_time' => 'datetime DEFAULT NULL',
'update_user_id' => 'int(11) DEFAULT NULL',
), 'ENGINE=InnoDB');
//create the user table
$this->createTable('tbl_user', array(
'id' => 'pk',
'username' => 'string NOT NULL',
'email' => 'string NOT NULL',
'password' => 'string NOT NULL',
'last_login_time' => 'datetime DEFAULT NULL',
'create_time' => 'datetime DEFAULT NULL',
'create_user_id' => 'int(11) DEFAULT NULL',
'update_time' => 'datetime DEFAULT NULL',
'update_user_id' => 'int(11) DEFAULT NULL',
), 'ENGINE=InnoDB');
//create the assignment table that allows for many-to-many
//relationship between projects and users
$this->createTable('tbl_project_user_assignment', array(
'project_id' => 'int(11) NOT NULL',
'user_id' => 'int(11) NOT NULL',
'PRIMARY KEY (`project_id`,`user_id`)',
), 'ENGINE=InnoDB');
//foreign key relationships
//the tbl_issue.project_id is a reference to tbl_project.id
$this->addForeignKey("fk_issue_project", "tbl_issue", "project_id", "tbl_project", "id", "CASCADE", "RESTRICT");
//the tbl_issue.owner_id is a reference to tbl_user.id
$this->addForeignKey("fk_issue_owner", "tbl_issue", "owner_id", "tbl_user", "id", "CASCADE", "RESTRICT");
//the tbl_issue.requester_id is a reference to tbl_user.id
$this->addForeignKey("fk_issue_requester", "tbl_issue", "requester_id", "tbl_user", "id", "CASCADE", "RESTRICT");
//the tbl_project_user_assignment.project_id is a reference to tbl_project.id
$this->addForeignKey("fk_project_user", "tbl_project_user_assignment", "project_id", "tbl_project", "id", "CASCADE", "RESTRICT");
//the tbl_project_user_assignment.user_id is a reference to tbl_ user.id
$this->addForeignKey("fk_user_project", "tbl_project_user_assignment", "user_id", "tbl_user", "id", "CASCADE", "RESTRICT");
}
public function down() {
$this->truncateTable('tbl_project_user_assignment');
$this->truncateTable('tbl_issue');
$this->truncateTable('tbl_user');
$this->dropTable('tbl_project_user_assignment');
$this->dropTable('tbl_issue');
$this->dropTable('tbl_user');
}
/*
// Use safeUp/safeDown to do migration with transaction
public function safeUp()
{
}
public function safeDown()
{
}
*/
}
现在的问题是,每当我尝试使用./yiic migrate应用此迁移时,它的失败都会出现同样的错误。这是我得到的样本输出。
[root@localhost protected]# ./yiic migrate
Yii Migration Tool v1.0 (based on Yii v1.1.14)
Total 1 new migration to be applied:
m130921_101251_tr
Apply the above migration? (yes|no) [no]:y
*** applying m130921_101251_tr
PHP Error[2]: include(m130921_101251_tr.php): failed to open stream: No such file or directory
in file /var/www/html/yii/framework/YiiBase.php at line 427
#0 /var/www/html/yii/framework/YiiBase.php(427): autoload()
#1 unknown(0): autoload()
#2 /var/www/html/yii/framework/cli/commands/MigrateCommand.php(429): spl_autoload_call()
#3 /var/www/html/yii/framework/cli/commands/MigrateCommand.php(384): MigrateCommand->instantiateMigration()
#4 /var/www/html/yii/framework/cli/commands/MigrateCommand.php(109): MigrateCommand->migrateUp()
#5 unknown(0): MigrateCommand->actionUp()
#6 /var/www/html/yii/framework/console/CConsoleCommand.php(172): ReflectionMethod->invokeArgs()
#7 /var/www/html/yii/framework/console/CConsoleCommandRunner.php(71): MigrateCommand->run()
#8 /var/www/html/yii/framework/console/CConsoleApplication.php(92): CConsoleCommandRunner->run()
#9 /var/www/html/yii/framework/base/CApplication.php(180): CConsoleApplication->processRequest()
#10 /var/www/html/yii/framework/yiic.php(33): CConsoleApplication->run()
#11 /var/www/html/Trackstar/protected/yiic.php(7): require_once()
#12 /var/www/html/Trackstar/protected/yiic(4): require_once()
我似乎无法找到解决上述问题的方法。我一直在google,stackoverflow和yii论坛上搜索相关答案,但我还没找到。请提供有关如何解决此问题的任何帮助。我是Yii的新手,所以我还在学习,我很喜欢它。但陷入困境的第一步是真正的挫折。任何形式的帮助都将非常感激。
谢谢, MAXX
有关更多说明。我发布了config / console.php和config / main.php
-------------配置/ console.php -------------------------
<?php
// This is the configuration for yiic console application.
// Any writable CConsoleApplication properties can be configured here.
return array(
'basePath'=>dirname(__FILE__).DIRECTORY_SEPARATOR.'..',
'name'=>'My Console Application',
// preloading 'log' component
'preload'=>array('log'),
// application components
'components'=>array(
// uncomment the following to use a MySQL database
'db'=>array(
'connectionString' => 'mysql:host=localhost;dbname=trackstar',
'emulatePrepare' => true,
'username' => 'user1',
'password' => 'mydb389',
'charset' => 'utf8',
),
'log'=>array(
'class'=>'CLogRouter',
'routes'=>array(
array(
'class'=>'CFileLogRoute',
'levels'=>'error, warning',
),
),
),
),
);
--------------------- end of console.php --------------------- -
------------------------配置/ main.php ------------------ ----
<?php
// uncomment the following to define a path alias
// Yii::setPathOfAlias('local','path/to/local-folder');
// This is the main Web application configuration. Any writable
// CWebApplication properties can be configured here.
return array(
'basePath'=>dirname(__FILE__).DIRECTORY_SEPARATOR.'..',
'name'=>'My Web Application',
// preloading 'log' component
'preload'=>array('log'),
// autoloading model and component classes
'import'=>array(
'application.models.*',
'application.components.*',
),
'modules'=>array(
// uncomment the following to enable the Gii tool
/*
'gii'=>array(
'class'=>'system.gii.GiiModule',
'password'=>'Enter Your Password Here',
// If removed, Gii defaults to localhost only. Edit carefully to taste.
'ipFilters'=>array('127.0.0.1','::1'),
),
*/
),
// application components
'components'=>array(
'user'=>array(
// enable cookie-based authentication
'allowAutoLogin'=>true,
),
// uncomment the following to enable URLs in path-format
/*
'urlManager'=>array(
'urlFormat'=>'path',
'rules'=>array(
'<controller:\w+>/<id:\d+>'=>'<controller>/view',
'<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',
'<controller:\w+>/<action:\w+>'=>'<controller>/<action>',
),
),
*/
// uncomment the following to use a MySQL database
'db'=>array(
'connectionString' => 'mysql:host=localhost;dbname=trackstar',
'emulatePrepare' => true,
'username' => 'user1',
'password' => 'mydb389',
'charset' => 'utf8',
),
'errorHandler'=>array(
// use 'site/error' action to display errors
'errorAction'=>'site/error',
),
'log'=>array(
'class'=>'CLogRouter',
'routes'=>array(
array(
'class'=>'CFileLogRoute',
'levels'=>'error, warning',
),
// uncomment the following to show log messages on web pages
/*
array(
'class'=>'CWebLogRoute',
),
*/
),
),
),
// application-level parameters that can be accessed
// using Yii::app()->params['paramName']
'params'=>array(
// this is used in contact page
'adminEmail'=>'webmaster@example.com',
),
);
-----------------------------结束config / main.php ----------- -----------
mysql> show tables
-> ;
+-------------------------+
| Tables_in_trackStar |
+-------------------------+
| tbl_migration |
+-------------------------+
1 row in set (0.00 sec)
mysql> desc tbl_migration;
+------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+-------+
| version | varchar(255) | NO | PRI | NULL | |
| apply_time | int(11) | YES | | NULL | |
+------------+--------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
答案 0 :(得分:3)
编辑:您不应重命名迁移文件类,因为文件名链接到数据库中的tbl_migrations。 因此,将您的迁移文件重命名为
类<?php
class m130921_101251_tr extends CDbMigration {
EDIT2:还要确保您的文件名为protected/migrations/m130921_101251_tr.php
EDIT3:以下是Yii迁移工作原理的逻辑流程,也许这会有所帮助
Yii Migration Tool v1.0 (based on Yii v1.1.14)
到此为止意味着框架已包含在内并且您的yiic.php设置正确
Total 1 new migration to be applied:
m130921_101251_tr
这几行意味着yiic能够扫描您的迁移目录,并且还可以连接您的数据库并检查迁移文件夹中的所有文件,并查看tbl_migrations中是否存在同名的行。没有行或列为新迁移的文件
Apply the above migration? (yes|no) [no]:y
*** applying m130921_101251_tr
这行输出意味着yiic现在正在尝试应用迁移,为此它将尝试查找扩展CDbMigration
框架类的相同类。如果yiic无法找到此课程,您将收到此错误。
PHP Error[2]: include(m130921_101251_tr.php): failed to open stream: No such file or directory in file /var/www/html/yii/framework/YiiBase.php at line 427
Yii的工作方式总是在PHP 5.3及以上版本中使用namspaces 查找与文件名相同的类名 来自Yii docs
命名空间类 命名空间类是指在非全局命名空间内声明的类。例如, application \ components \ GoogleMap类是在 名称空间应用\组件。使用命名空间类需要 PHP 5.3.0或更高版本。
从版本1.1.5开始,可以使用命名空间类 没有明确地包括它。例如,我们可以创建一个新的 application \ components \ GoogleMap的实例,不包括 明确对应的类文件。这是可能的 增强的Yii类自动加载机制。
我能够模拟错误的唯一情况是不使用Php 5.3或更高版本或类名与文件不匹配
答案 1 :(得分:0)
文件未正确包含在内。
include(m130921_101251_tr.php);
这就是为什么它无法找到你的班级。
尝试在 include
构造中为您的文件提供正确的路径。