数据库的存储操作问题(我只接触到了表象)

文档问题 · Tudou · 于 6年前 发布 · 1850 次阅读

经过一段时间的研究,还是没能够深入的理解到数据库的具体操作方法。

首先定义一个服务类,继承service

然后声明一个2个属性:$_xxModel,$_xxModelName;

$_xxModelName = 数据库配置文件地址如:
$_xxModelName =appadmin\local\local_models\mysqldb\customer

然后按照其他文件的样式在构造函数执行如下方法:(这个我只会用,但不明白意思)

list($this->_xxModelName,$this->_xxModel) = \Yii::mapGet($this->_xxModelName);

比如查找:。

return $this->_xxModel->find()->where(array("id"=>$id))->all();

这个应该是查找配置表的一行的数据 现在查的问题,还可以仿造弄一弄。但是存的时候我发现:我用YII2原生的方法存就可以,如:

Yii::$app->db->createCommand()->insert('table_name', [
        'msg'         => $msg,
        'customer_id' => $id,
        'created_at'  => $t,
    ])->execute();

如果执行以上代码就可以存入数据。但是我使用:

 $arr =  [
        'msg'         => $msg,
        'customer_id' => $id,
        'created_at'  => $t,
    ];
    return $this->_xxModel->insert('tabl_name',$arr);

就会看到数据库有一个ID 但是没有数据, 我就是想问一下我是不是这个数据的格式保存的不对? 还有就是如果我保存之后想返回保存的ID 又该怎么处理呢?

共收到 2 条回复
Fecmall#16年前 1 个赞

您好,逐个回答您的问题:

问题1:

list($this->_xxModelName,$this->_xxModel) = \Yii::mapGet($this->_xxModelName);,为什么要这样写,而不是直接通过use 引入model?

答:fecshop 希望用户可以在不修改源代码的前提下,可以修改任意功能,因此,如果使用use xxxxxx/Model,用户无法通过配置重写这个Model,因此,通过 \Yii::mapGet 函数,这个函数会去读取配置,是否存在重写,如果存在,则使用重写的,如果不存在,则使用当前赋值的,关于这个机制,详细参看:fecshop 重写机制, 该页面的 8.通过rewriteMap进行重写Block Model 层

使用起来会感觉有点绕,但这也是没办法的事,当你在本地开发的时候,可以直接引入 use xxxxxx/Model , 直接使用,因为你本地开发的程序,不是做库包,因此如果想修改,直接修改就好了

因此,你本地可以直接

use  appadmin\local\local_models\mysqldb\Customer;
...

Customer::find()->where(array("id"=>$id))->all();

问题2:这个应该是查找配置表的一行的数据 现在查的问题,还可以仿造弄一弄。但是存的时候我发现:我用YII2原生的方法存就可以,如:

Yii::$app->db->createCommand()->insert('table_name', [
        'msg'         => $msg,
        'customer_id' => $id,
        'created_at'  => $t,
    ])->execute();

答:肯定可以,使用使用php的原生sql都可以,使用yii2的ActiveRecord,维护以及代码可读性会更好,代码更精简。

另外,对于mysql,mongodb,不同类型的数据库,在使用AR的时候,很多操作几乎是一样的(当然也存在一定的差异)

问题3:ActiveRecord 保存后返回Id的问题

答: 插入数据后,id会保存到model的属性中,代码示例如下:

// 假设数据库是mysql ,主键为id。
function insert(){
	
	$ob = new $this->_xxModelName;
	$ob->email = 'xxxx',
	$ob->first_name = 'xxx',
	...
	$ob->save();
	return $ob->id;
}


返回的就是insert数据后的id

Fecmall#26年前 0 个赞

对于问题2,在补充一下:

Yii::$app->db->createCommand()

db是Yii的一个组件,对应的是mysql,如果我有另外一个数据库,设置的是db2,如果我要将某些数据表移动到db2里面(假设有这种需求),那么,我需要在很多代码处进行更改成

Yii::$app->db2->createCommand()

但是,我如果用AR,修改一个方法就可以了,维护成本大大降低。

public static function getDb()
    {
        return Yii::$app->getDb2();
    }
添加回复 (需要登录)
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册
Your Site Analytics