yiic迁移错误,无法打开流

时间:2013-09-21 04:49:44

标签: php yii database-migration yiic

尝试使用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)

2 个答案:

答案 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 构造中为您的文件提供正确的路径。