[总结]Yii2 操作数据库的几种方式

作者: wxfeng 分类: php 发布时间: 2018-03-12 00:00    阅读 1,071 次

一、Yii2操作数据库的几种选择

1 PDO方式(适合多表连接查询)。

$sql = "";
//原生态sql语句 Yii::$app->db->createCommand($sql)->execute();非select语句(update、insert、delete)
Yii::$app->db->createCommand($sql)->queryRow(); 查询select一条记录
Yii::$app->db->createCommand($sql)->queryAll(); 查询select多条记录

$sql = "select a.*, count(b.role_id)as num from {{user_role}} a left join {{user}} b on a.id = b.role_id group by b.role_id order by a.id";
$user_role_info = Yii::$app->db->createCommand($sql)->queryAll();
$this->render("list", array('user_role_info'=>$user_role_info));

比如

$sql = "select a.*, count(b.role_id)as num from slgo_user_role a left join slgo_user b on a.id = b.role_id group by b.role_id order by a.id";
$user_role_info = Yii::$app->db->createCommand($sql)->queryAll();
$this->render("list", array('user_role_info'=>$user_role_info));

2 Active Record方式 
(1)New

$post=new Post; 
$post->title='sample post'; 
$post->content='post body content'; 
$post->save();

(2)Criteria方式 
也可以使用 $condition 指定更复杂的查询条件。 不使用字符串, 我们可以让 $condition 成为一个 CDbCriteria 的实例, 
它允许我们指定不限于 WHERE 的条件。

$criteria=new CDbCriteria; 
$criteria->select='title';  // 只选择 'title' 列 $criteria->condition='postID=:postID'; 
$criteria->params=array(':postID'=>10); 
$post=Post::model()->find($criteria);

一种替代 CDbCriteria 的方法是给 find 方法传递一个数组。 数组的键和值各自对应标准(criterion)的属性名和值, 
上面的例子可以重 写为如下:

$post=Post::model()->find(array( 
    'select'=>'title', 
    'condition'=>'postID=:postID', 
    'params'=>array(':postID'=>10), 
));

当一个查询条件是关于按指定的值匹配几个列时, 我们可以使用 findByAttributes()。我们使 $attributes 参数是一个以列名做索引的值的数组。
在一些框架中, 此任务可以通过调用类似findByNameAndTitle的方法实现。
虽然此方法看起来很诱人, 但它常常引起混淆, 冲突 和比如列名大小写敏感的问题。

3 Query Builder 方式

$user = Yii::app()->db->createCommand() 
    ->select('id, username, profile') 
    ->from('tbl_user u') 
    ->join('tbl_profile p', 'u.id=p.user_id') 
    ->where('id=:id', array(':id'=>$id)) 
    ->queryRow();

二、Yii操作数据库的几种选择与mysql_escape_string方法 
mysql_escape_string是转义sql中的特殊字符。 
1 创建记录时 
当直接执行sql时, 需要加mysql_escape_string方法。 
当使用yii框架式, 不需要加(因为Yii已经添加验证)。

2 查询记录时 
当直接执行sql时, 需要加mysql_escape_string方法。 
当使用yii框架式, 如果在find中直接拼接sql, 则也需要添加, 如果使用param数组方式, 不需要加(因为Yii已经添加验证)。

连接数据库的两种方法:

Yii::app()->createCommand($sql)->queryAll();
xxx::model()->dbConnection->createCommand($sql)->queryAll();

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!

发表评论

您的电子邮箱地址不会被公开。