YII2框架详解-数据库操作详解

1、数据库连接

简介

一个项目根据需要会要求连接多个数据库,那么在yii2中如何链接多数据库呢?其实很简单,在配置文件中稍加配置即可完成。

配置

打开数据库配置文件common\config\main-local.php,在原先的db配置项下面添加db2,配置第二个数据库的属性即可


'db' => [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=hyii2', //数据库hyii2
'username' => 'root',
'password' => 'pwhyii2',
'charset' => 'utf8',
],
'db2' => [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=hyii', //数据库hyii
'username' => 'root',
'password' => 'pwhyii',
'charset' => 'utf8',
],

如上配置就可以完成yii2连接多个数据库的功能,但还是需要注意几个点

如果使用的数据库前缀 在建立模型时 这样: eg:这个库叫 haiyong_test return {{%test}}

应用

1.我们在hyii数据库中新建一个测试表test

YII2框架详解-数据库操作详解

2.通过gii生成模型,这里需要注意的就是数据库链接ID处要改成db2

YII2框架详解-数据库操作详解

3.查看生成的模型,比正常的model多了红色标记的地方

YII2框架详解-数据库操作详解

所以各位童鞋,如果使用多数据配置,在建db2的模型的时候,也要加上上图红色的代码。

好了,以上步骤就完成了,yii2的多数据库配置,配置完成之后可以和原因一样使用model或者数据库操作

2、数据操作:

方式一:使用createCommand()函数

增加

获取自增id

$id=Yii::$app->db->getLastInsertID();
Yii::$app->db->createCommand()->insert('user', [
'name' => 'test',
'age' => 30,
])->execute();

批量插入数据


Yii::$app->db->createCommand()->batchInsert('user', ['name', 'age'], [
['test01', 30],
['test02', 20],
['test03', 25],
])->execute();

删除

Yii::$app->db->createCommand()->delete('user', 'age = 30')->execute();

修改

Yii::$app->db->createCommand()->update('user', ['age' => 40], 'name = test')->execute();

查询


//createCommand(执行原生的SQL语句)
$sql= "SELECT u.account,i.* FROM sys_user as u left join user_info as i on u.id=i.user_id";
$rows=Yii::$app->db->createCommand($sql)->query();

查询返回多行:
$command = Yii::$app->db->createCommand('SELECT * FROM post');
$posts = $command->queryAll();

返回单行
$command = Yii::$app->db->createCommand('SELECT * FROM post WHERE id=1');

$post = $command->queryOne();

查询多行单值:
$command = Yii::$app->db->createCommand('SELECT title FROM post');
$titles = $command->queryColumn();

查询标量值/计算值:
$command = Yii::$app->db->createCommand('SELECT COUNT(*) FROM post');
$postCount = $command->queryScalar();

方式二:模型处理数据(优秀程序媛必备)!!

新增(因为save方法有点low)所以自己在模型层中定义:add和addAll方法

注意:!!!当setAttributes($attributes,fase);时不用设置rules规则,否则则需要设置字段规则;

//入库一维数组

public function add($data)

{

$this->setAttributes($data);

$this->isNewRecord = true;

$this->save();

return $this->id;

}

//入库二维数组

public function addAll($data){

$ids=array();

foreach($data as $attributes)

{

$this->isNewRecord = true;

$this->setAttributes($attributes);

$this->save()&& array_push($ids,$this->id) && $this->id=0;

}

return $ids;

}

public function rules()

{

return [

[['title','content'],'required'

]];

}

控制器:

$ids=$model->addAll($data);

var_dump($ids);

删除

使用model::delete()进行删除


$user = User::find()->where(['name'=>'test'])->one();
$user->delete();

直接删除:删除年龄为30的所有用户

$result = User::deleteAll(['age'=>'30']);

根据主键删除:删除主键值为1的用户

$result = User::deleteByPk(1);
 /**
* @param $files 字段
* @param $values 值
* @return int 影响行数
*/
public function del($field,$values){
// $res = $this->find()->where(['in', "$files", $values])->deleteAll();
$res=$this->deleteAll(['in', "$field", "$values"]);
return $res;
}

修改

使用model::save()进行修改


$user = User::find()->where(['name'=>'test'])->one(); //获取name等于test的模型
$user->age = 40; //修改age属性值
$user->save(); //保存

直接修改:修改用户test的年龄为40

$result = User::model()->updateAll(['age'=>40],['name'=>'test']);
/**
* @param $data 修改数据
* @param $where 修改条件
* @return int 影响行数
*/
public function upda($data,$where){

$result = $this->updateAll($data,$where);
// return $this->id;
return $result;
}

基础查询

Customer::find()->one(); 此方法返回一条数据;
Customer::find()->all(); 此方法返回所有数据;
Customer::find()->count(); 此方法返回记录的数量;
Customer::find()->average(); 此方法返回指定列的平均值;
Customer::find()->min(); 此方法返回指定列的最小值 ;
Customer::find()->max(); 此方法返回指定列的最大值 ;
Customer::find()->scalar(); 此方法返回值的第一行第一列的查询结果;
Customer::find()->column(); 此方法返回查询结果中的第一列的值;
Customer::find()->exists(); 此方法返回一个值指示是否包含查询结果的数据行;
Customer::find()->batch(10); 每次取10条数据
Customer::find()->each(10); 每次取10条数据,迭代查询
//根据sql语句查询:查询name=test的客户
Customer::model()->findAllBySql("select * from customer where name = test");
//根据主键查询:查询主键值为1的数据
Customer::model()->findByPk(1);
//根据条件查询(该方法是根据条件查询一个集合,可以是多个条件,把条件放到数组里面)
Customer::model()->findAllByAttributes(['username'=>'admin']);
//子查询
$subQuery = (new Query())->select('COUNT(*)')->from('customer');

// SELECT `id`, (SELECT COUNT(*) FROM `customer`) AS `count` FROM `customer`
$query = (new Query())->select(['id', 'count' => $subQuery])->from('customer');
//关联查询:查询客户表(customer)关联订单表(orders),条件是status=1,客户id为1,从查询结果的第5条开始,查询10条数据
$data = (new Query())
->select('*')
->from('customer')
->join('LEFT JOIN','orders','customer.id = orders.customer_id')
->where(['status'=>'1','customer.id'=>'1'])
->offset(5)
->limit(10)
->all()

关联查询


/**
*客户表Model:CustomerModel
*订单表Model:OrdersModel
*国家表Model:CountrysModel
*首先要建立表与表之间的关系
*在CustomerModel中添加与订单的关系
*/
Class CustomerModel extends \yii\db\ActiveRecord
{
...
//客户和订单是一对多的关系所以用hasMany
//此处OrdersModel在CustomerModel顶部别忘了加对应的命名空间
//id对应的是OrdersModel的id字段,order_id对应CustomerModel的order_id字段
public function getOrders()
{
return $this->hasMany(OrdersModel::className(), ['id'=>'order_id']);
}

//客户和国家是一对一的关系所以用hasOne

public function getCountry()
{
return $this->hasOne(CountrysModel::className(), ['id'=>'Country_id']);
}
....
}

// 查询客户与他们的订单和国家
CustomerModel::find()->with('orders', 'country')->all();

// 查询客户与他们的订单和订单的发货地址(注:orders 与 address都是关联关系)
CustomerModel::find()->with('orders.address')->all();

// 查询客户与他们的国家和状态为1的订单
CustomerModel::find()->with([
'orders' => function ($query) {
$query->andWhere('status = 1');
},
'country',
])->all();

资料来源:https://blog.csdn.net/woshihaiyong168/article/details/53018016


分享到:


相關文章: