[总结]Yii2 操作数据库的几种方式
一、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();