【问题标题】:Yii framework - changing DatabaseYii 框架 - 改变数据库
【发布时间】:2014-07-16 01:18:23
【问题描述】:

我刚刚迁移到 yii,我创建了一个模型,它用 gii 创建了一个 CActiveRecord,然后我在数据库中做了一些更改,然后它让我感到困惑,现在我的问题是:

1 - 在对数据库进行任何更改后,我是否应该使用 gii 重新创建模型?为什么 yii 中的 Active Record 比其他框架如 zend 或 codigniter 复杂得多!?

编辑:

如果我们不应该改变模型类,我们应该把我们的数据库函数放在哪里!!? Model 不就是为了这样做吗?

【问题讨论】:

  • 肯定会改变你的模型,除非你在一个非常简单的项目中工作,你可以使用从 Gii 生成的 CRUD。在任何更雄心勃勃的项目中,模型都包含应用程序逻辑的核心。

标签: php yii


【解决方案1】:

如果我使用 gii 生成模型,它只有一次性工作。快速开始使用这个模型。之后如果你改变你的数据库结构(顺便说一句你没有告诉你做了什么样的改变)你可以手动改变模型。

如果您通过 gii 生成模型并且没有更改模型,您可以再次重新生成它(因为没有进行手动更改)。 如果您已经更改了它,则无需努力进行更改(并开始学习 ActiveRecord 的旅程)。

只是为了学习从头开始创建模型(没有 gii)。

【讨论】:

  • 我想补充一点,我从不重新创建我的模型。 Gii 只是一个帮助您入门的玩具。之后,您的模型通常会随着时间的推移而增长,因为您将添加大量自定义代码。根据我的经验,最常见的初学者“错误”是将大量与模型相关的代码放入控制器中。如果您将与模型相关的代码移动到它所属的位置,您就不想重新创建模型。
【解决方案2】:

您始终可以使用 Gii 预览它想要应用于现有模型的更改(使用差异链接)。然后您可以应用它们,但如果您在模型中插入了自定义规则(rules() 方法),它们将被覆盖。是的,如果您对数据库表进行任何更改,您将不得不更新您的 CActiveRecord 子类(您的模型),否则 Yii 将无法看到您的新字段,或者如果它尝试访问它认为拥有的字段则失败但已从数据库中删除。

没有什么能阻止您在模型中编写自定义方法。但是“放置我们的数据库函数”到底是什么意思?

【讨论】:

  • 我的意思是不要在 Controller 内部做任何 SQL 操作,如果我想添加一个函数,请将其添加到此模型中,但我知道最好不要这样做。
【解决方案3】:

简单
1)进入你的应用程序 index.php 创建全局变量

<?php

$GLOBALS['database'] = "mydbname"; //database name

// change the following paths if necessary
$yii=dirname(__FILE__).'/../yii/framework/yii.php';
$config=dirname(__FILE__).'/protected/config/main.php';

// remove the following lines when in production mode
defined('YII_DEBUG') or define('YII_DEBUG',true);
// specify how many levels of call stack should be shown in each log message
defined('YII_TRACE_LEVEL') or define('YII_TRACE_LEVEL',3);

require_once($yii);
Yii::createWebApplication($config)->run();

2) 在我的模型中创建一个构造方法

class Employees extends CActiveRecord
{

    function __construct()
    {
        $dbname = $GLOBALS['database'];

        Yii::app()->db->setActive(false);
        Yii::app()->db->connectionString = 'mysql:host=localhost;dbname='.trim($dbname);
        Yii::app()->db->setActive(true);
    }   

3) 如何使用到我的控制器中

public function actionVer3()
{
   $GLOBALS['database']="classicmodels"; //dbname
   $employee = Employees::model()->findByAttributes(array("employeeNumber"=>"1002"));

   print_r($employee);

   echo "<br><hr>";
   //$this->render("index");
}

简单的方法tnx。

【讨论】:

    【解决方案4】:

    我认为,理想情况下,您应该在数据库结构更改后重新创建模型。

    在我们的项目中,我们遵守规则,

    不要对 gii 生成的模型进行任何更改。所以如果 将来有DB更改,我们可以直接重新生成 模型,并且不会进行合并。

    这也符合设计哲学,

    **Objects** hide their data behind abstractions and expose functions that operate on that data.
    
    **Data structures**
    expose their data and have no meaningful functions. It only has methods to operate on data.
    

    ActiveRecords(yii 中的模型)只是数据结构。通过在 ActiveRecords 中添加业务规则,您可以混合数据结构和对象。

    【讨论】:

    • 你的意思是模型是黑盒子,不应该改变?!那么我们应该把sql函数放在哪里呢?
    • 我是说,如果您的数据库已更改并且模型已重新生成,生成模型中的代码更改将增加您的合并工作量。理想情况下,您的 SQL 查询无论如何都不会在模型中,它会在控制器中或您创建的 DAO。
    • 在你看来,yii 中的对象是什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多