Yii框架 - 改变数据库

我只是迁移到yii,我创建了一个模型,它用gii创建了一个CActiveRecord,之后我做了一些修改 在数据库中,它让我感到困惑,现在我的问题是:</ p>

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

编辑:</ strong> </ p>

如果我们 不应该改变Model Class,我们应该把数据库函数放在哪里!!? 不是模型是这样做的吗?</ p>
</ div>

展开原文

原文

I just migrate to yii and i created a model which it created an CActiveRecord with gii and after that i make some changes in database then it make me confused, now my question is :

1 - Should i recreate Model with gii after any change to database ? Why Active record in yii is much complicated than other frameworks like zend or codigniter !?

Edit :

If we should not change Model Class, where should we put our database functions !!? aren't Model is there for doing so?

doufeng3602
doufeng3602 你肯定会改变你的模型,除非你在一个非常简单的项目上工作,你可以使用从Gii生成的CRUD。在任何更雄心勃勃的项目中,模型都包含应用程序逻辑的内容。
7 年多之前 回复

4个回答



如果我使用gii生成模型,那只是一次性工作。 快速开始使用此模型。 之后,如果你改变你的数据库结构(顺便说一下你没有告诉你做了什么样的改变),你可以手动更改模型。</ p>

如果你通过gii生成模型并且没有改变 您可以再次重新生成模型(因为没有进行手动更改)。

如果你已经改变了它,那么就没有必要去改变它(以及学习ActiveRecord的过程)。 </ p>

只是从头开始学习创建模型(没有gii)。</ p>
</ div>

展开原文

原文

If I generate model with gii its only one-time job. To start quickly using this model. After that if you alter your database structure( btw you didn't tell what kind of changes you made) you can change model manually.

If you generated model via gii and didn't change model you can regenerate it again (because no manual changes made). If you already changed it there is no hard work to change it (and take journey of learning about ActiveRecord).

Just for learning create model from scratch (without gii).

dongxizhe9755
dongxizhe9755 我想补充一点,我永远不会重新创建我的模型。 Gii只是一款可以帮助您入门的玩具。 之后,您的模型通常会随着时间的推移而增长,因为您将添加大量自定义代码。 根据我的经验,最常见的初学者“错误”是将大量与模型相关的代码放入控制器中。 如果将模型相关代码移动到它所属的位置,则不希望重新创建模型。
7 年多之前 回复



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

没有什么能阻止你在模型中编写自定义方法。 但究竟是什么意思“把我们的数据库功能”?</ p>
</ div>

展开原文

原文

You can always use Gii to preview the changes that it wants to apply to the existing model (using the diff link). Then you can apply them, but in case you have inserted custom rules inside the model (rules() method), they will be overwritten. And yes, if you do any changes to your database tables, you will have to update your CActiveRecord subclasses (your models), otherwise Yii will not be able to see your new fields or fail if it tries to access fields that it thinks it has but were deleted from the database.

Nothing stops you from writing your custom methods inside the model. But what exactly do you mean by "put our database functions"?

douzhi2012
douzhi2012 我的意思是不要在Controller中做任何SQL,如果我想添加一个函数将它添加到这个模型中,但我明白最好不要这样做。
7 年多之前 回复



EASY

1)进入你的aplicacion index.php创建全局变量</ p>

 <  code>&lt;?php 

$ GLOBALS ['database'] =“mydbname”; //数据库名称

//在必要时更改以下路径
$ yii = dirname(__ FILE )。'/ .. / yii / framework / yii.php';
$ config = dirname(
FILE__)。 '/protected/config/main.php';

//在生产模式下删除以下行
defined('YII_DEBUG')或define('YII_DEBUG',true);
//指定多少级别 调用堆栈应显示在每个日志消息
defined('YII_TRACE_LEVEL')或define('YII_TRACE_LEVEL',3);

require_once($ yii);
Yii :: createWebApplication($ config) - &gt; run( );
</ code> </ pre>

2)在我的模型中创建构造方法</ p>

 类Employees扩展CActiveRecord 
{\ n
function __construct()
{
$ dbname = $ GLOBALS ['database'];

Yii :: app() - &gt; db-&gt; setActive(false);
Yii :: app() - &gt; db-&gt; connectionString ='mysql:host = localhost; dbname ='。trim($ dbname);
Yii :: app() - &gt; db-&gt; setActive(true); \ n}
</ code> </ pre>

3)如何使用我的控制器</ p>

  public function actionVer3()
{\ ñ $ GLOBALS [ '数据库'] = “classicmodels”; // dbname
$ employee = Employees :: model() - &gt; findByAttributes(array(“employeeNumber”=&gt;“1002”));

print_r($ employee);

echo“&lt; ; br&gt;&lt; hr&gt;“;
// $ this-&gt; render(”index“);
}
</ code> </ pre>

简单方法tnx。< / p>
</ div>

展开原文

原文

EASY
1) Into your aplicacion index.php create global variable

<?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) Into my model create a construct method

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) How to use into my controller

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

   print_r($employee);

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

Easy way tnx.



我认为,理想情况下,您应该在DB结构更改后重新创建模型。</ p>

在我们的项目中 ,我们遵循规则,</ p>


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

这也符合哲学 设计,</ p>

  对象隐藏抽象背后的数据并公开对该数据进行操作的函数。

数据结构 \显示其数据 并没有任何有意义的功能。 它只有操作数据的方法。
</ code> </ pre>

ActiveRecords(yii中的模型)只不过是数据结构。通过在ActiveRecords中添加业务规则,你是 混合数据结构和对象。</ strong> </ p>
</ div>

展开原文

原文

I think, You should ideally recreate the model after DB structural changes.

In our project, We are following the rule,

Do not make any changes in the models generated by gii. So that if there are DB changes in future, we could directly regenerate the models and will have no merging efforts.

This is also inline with philosophy of design,

**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(models in yii) are nothing but data structures.By adding business rules in ActiveRecords, you are mixing your data structures and objects.

duanlinpi0265
duanlinpi0265 在你看来,yii中对象的等价物是什么?
大约 6 年之前 回复
dongpo2002
dongpo2002 我说,生成的模型中的代码更改会增加您的合并工作,如果您的数据库已更改并且模型被重新生成。理想情况下,您的SQL查询无论如何都不会在模型中,它将在Controller或您创建的DAO中。
7 年多之前 回复
douyan0732
douyan0732 你的意思是模特是黑盒子,不应该改变吗?!! 那么我们应该把sql函数放在哪里?
7 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐