牛骨文教育服务平台(让学习变的简单)
博文笔记

Yii学习笔记(数据库操作两大类总结)

创建时间:2016-08-06 投稿人: 浏览次数:583
<?php
//一、创建数据库连接(以下两种)
//1
$connection=new CDbConnection($dsn,$name,$pass);//依据数据库类型的不同$dns也不一致

//由于CDbConnection继承自CApplicationComponent,一般在数据库中增加以下配置,可以把其当做一个组件使用
//2
"components"=>array(
//其他配置
"db"=>array(
"class"=>"CDbConnection",
"connectionString"=>"mysql:host=localhost;dbname=testdb",
"username"=>"root",
"password"=>"password",
"emulatePrepare"=>true,
),
),
//然后我们可以这样去用了,Yii::app()->db。很方便。


//二、执行我们的sql语句

createCommand()//可以很方便的为我们创建一个CDbCommand实例

$conn = Yii::app()->db;
$sql ="SELECT * FORM `user`";
$command=$connection->createCommand($sql);

//然后sql语句会通过以下两种方式执行
execute()//执行一个无查询SQL语句,INSERT UPDATE DELETE,返回受影响的行数。

query()//查询,如果成功,它将返回CDbDataReader实例,通过此实例可以遍历数据的结果行。但是我们一般使用queryXXX()方法以直接返回查询结果。

$rowCount=$command->execute(); // 执行影响会记录的SQL语句
$dataReader=$command->query(); // 执行一个 SQL 查询,返回CDbDataReader实例
$rows=$command->queryAll(); // 返回所有结果
$row=$command->queryRow(); // 返回第一行
$column=$command->queryColumn(); // 返回第一列
$value=$command->queryScalar(); // 返回第一行的第一个字段

//三、绑定参数

//个人理解绑定参数:就是在一条sql语句中占座,然后当执行sql的时候把参数对号入座。对号的过程中还会验证是否合法。有点像考试安排座位、考场一样,防止替考。

//绑定参数有以下两种方法:
$command->bindParam(":username",$username,PDO::PARAM_STR);//绑定一个PHP变量
$command->bindValue(":user_id",1,PDO::PARAM_INT)//绑定一个参数

//PDO里面有好多预定义常量,放在这可以验证参数的

//表前缀首先设置CDbConnection::tablePrefix,然后在sql语句中使用: {{No Prefix TableName}},这样在sql执行的时候就可以自动组装表前缀

//Query生成器:就是可以使用类的方法和属性生成sql语句的东西。方便快捷还很优美。

$user = Yii::app()->db->createCommand() //创建CDbCommand实例
->select("id, username, profile") //然后开始按照手册倒腾
->from("tbl_user u")
->join("tbl_profile p", "u.id=p.user_id")
->where("id=:id", array(":id"=>$id))
->queryRow(); //走你...
//好处很多,注意一点就是sql语句和query生成器不能混用。
//方法
select(): //指定查询的选择部分
selectDistinct(): //指定查询不重复的选择部分
from(): //指定查询的FROM
where(): //指定查询的WHERE
andWhere(): //用and的方式添加到WHERE的条件中
orWhere(): //用or的方式添加到WHERE的条件中
join(): //添加一个内部联接的查询片段
leftJoin(): //追加一个左外连接查询片段
rightJoin(): //追加一个右外部联接查询片段
crossJoin(): //追加一个交叉连接查询片段
naturalJoin(): //追加一个自然连接查询片段
group(): //指定查询的GROUP BY
having(): //指定查询的HAVING
order(): //指定查询的ORDER BY
limit(): //指定查询的LIMIT
offset(): //指定查询的OFFSET
union(): //添加查询的UNION

//还可以像下面这样用
$row = Yii::app()->db->createCommand(array(
"select" => array("id", "username"),
"from" => "tbl_user",
"where" => "id=:id",
"params" => array(":id"=>1),
))->queryRow();

//同一个CDbCommand实例可以执行多个sql,调用reset就好
$command->reset();

//insert($table, $columns)
//insert()方法的建立和执行一条INSERT SQL语句,$table 参数指定要插入的表,而键值对数组 $columns指定要插入的列的值。
$command->insert("tbl_user", array(
"name"=>"Tester",
"email"=>"tester@example.com",
));

//update($table, $columns, $conditions="", $params=array())
//update()方法的建立和执行一个SQL更新语句。 $table 参数指定要更新的表; $columns是键值对的数组,用于指定要更新的列值的;$conditions 和 $params 像where()一样,指定 UPDATE 语句中的 WHERE 子句。
$command->update("tbl_user", array(
"name"=>"Tester",
), "id=:id", array(":id"=>1));
//delete($table, $conditions="", $params=array())
//delete()方法的建立和执行一个SQL删除语句。 $table 参数指定要删除数据的表;$conditions 和$params像where()一样,指定 DELETE 语句中的 WHERE 子句。
$command->delete("tbl_user", "id=:id", array(":id"=>1));


############################################################################################################################################第二大类来临(Active Record)##########################################################################################################################################################

//官方解释:Active Record(AR)是一个流行的对象-关系映射(ORM)技术。每个AR类代表一个数据表(或视图),数据表-列在AR 类中体现为类的属性,一个AR实例则表示表中的一行。常见的CRUD操作作为AR的方法实现。因此我们可以以一种更加面向对象的方式访问数据。
//来个具体的

//首先建立数据库连接,一样的在配置文件里面添加
"components"=>array(
//其他配置
"db"=>array(
"class"=>"CDbConnection",
"connectionString"=>"mysql:host=localhost;dbname=testdb",
"username"=>"root",
"password"=>"password",
"emulatePrepare"=>true,
),
),


//然后用gii生成表对应的model文件,大概样子是这样的

class Post extends CActiveRecord
{
public static function model($className=__CLASS__)
{
return parent::model($className);
}

public function tableName()
{
//如果需要使用表前缀功能return "{{post}}";
return "tbl_post";
}
}

//然后实例化类 $post = new Post

//1.保存记录

$post=new Post;
$post->title="sample post";
$post->create_time=time();
$post->save();

//2.读取记录

//一条记录 back null

// 查找满足指定条件的结果中的第一行
$post=Post::model()->find($condition,$params);
// 查找具有指定主键值的那一行
$post=Post::model()->findByPk($postID,$condition,$params);
// 查找具有指定属性值的行
$post=Post::model()->findByAttributes($attributes,$condition,$params);
// 通过指定的 SQL 语句查找结果中的第一行
$post=Post::model()->findBySql($sql,$params);

//我也不知道多少条记录 back 空数组

// 查找满足指定条件的所有行
$posts=Post::model()->findAll($condition,$params);
// 查找带有指定主键的所有行
$posts=Post::model()->findAllByPk($postIDs,$condition,$params);
// 查找带有指定属性值的所有行
$posts=Post::model()->findAllByAttributes($attributes,$condition,$params);
// 通过指定的SQL语句查找所有行
$posts=Post::model()->findAllBySql($sql,$params);

//为了应对复杂的使用条件,可以把condition编程一个CDbCriteria实例,它允许我们指定不限于 WHERE 的条件。
$criteria=new CDbCriteria;
$criteria->select="title"; // 只选择 "title" 列
$criteria->condition="postID=:postID";
$criteria->params=array(":postID"=>10);
$post=Post::model()->find($criteria);

//我们还可以给find传一个数组来满足我们的条件:
$post=Post::model()->find(array(
"select"=>"title",
"condition"=>"postID=:postID",
"params"=>array(":postID"=>10),
));

//更新
$post=Post::model()->findByPk(10);
$post->title="new post title";
$post->save();

// 更新符合指定条件的行
Post::model()->updateAll($attributes,$condition,$params);
// 更新符合指定条件和主键的行
Post::model()->updateByPk($pk,$attributes,$condition,$params);
// 更新满足指定条件的行的计数列
Post::model()->updateCounters($counters,$condition,$params);

//删除
$post=Post::model()->findByPk(10); // 假设有一个帖子,其 ID 为 10
$post->delete();

// 删除符合指定条件的行
Post::model()->deleteAll($condition,$params);
// 删除符合指定条件和主键的行
Post::model()->deleteByPk($pk,$condition,$params);

//暂时中止,还有好多要学习,慢慢使用中记住它们》》》...
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。