使用Doctrine进行mysql更删改查操作,事务处理,生命周期的管理
1.先记录最简单的插入操作
$em = $this->getDoctrine()->getManager(); //用doctrine进行管理
$book = new Book();
$book->setName(); //生成book对象并进行初始化
$em->persist($book); //交给doctrine管理,生成sql语句
$em->flush(); //执行sql语句,刷新数据库
2.查找操作,
一般查询需要使用repository,所以先提前写好获取repository的方法
//获取userRepository
/**
* @return ScourgenWebBundleEntityUserRepository
*/
protected function getUserRepository(){
return $this->getDoctrine()->getManager()->getRepository('ScourgenWebBundle:User');
}
//获取book的
/**
* @return ScourgenWebBundleEntityBookRepository
*/
protected function getBookRepository(){
return $this->getDoctrine()->getManager()->getRepository('ScourgenWebBundle:Book');
}
接下来演示几个基本的查询操作
//有三种方法,findAll,findOneBy,findBy进行查询
//findBy 根据传入条件进行查询,返回一个数据集,可以使用foreach进行遍历
//这里看一下findBy的原型声明
public function findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null);
//可以看出第一个参数是字段,第二个是按照某个字段进行排序,$limit限制返回数据条数,$offset不清楚暂时
//按照标题字段进行查询并按照price降序排序
/** @var $book ScourgenWebBundleEntityBook*/ 使用annoation表明$book是一个Book对象
$books = $this->getBookRepository()->finBy(array('title'=>'书本'),array('price'=>'DESC'));
foreach($books as $book){
echo "相应的数据操作";
}
//findOneBy
//先看一下fingOneBy函数原型,参数都类似,由于是查找一个,所以就没有offset和limit参数,只需要注意返回的只是一个对象,
public function findOneBy(array $criteria, array $orderBy = null);
//findAll() 这个简单,查找所有数据,一般不会用到
//这里暂时只学习这几个简单的,之后再进行补充
//还有的时候需要使用原生sql语句进行查询,具体流程如下
$sql = "select book.title from book where book.id =1 or book.id=2;";生成sql语句
$this->get("database_connection")->fetchAll($sql); //使用fetchAll方法进行查询,返回数据集,但是需要注意,这样返回的数据不是我们所定义的Book对象,而是原生的mysql对象
//删除操作更简单
先查找需要删除的数据,之后使用persist()交给doctrine进行托管,最后用$em->remove(); 方法从数据库当中删除数据
//这里说明以下doctrine的事务处理,
$em = $this->getDoctrine()->getManager();
$em->getConnection()->beginTransaction(); //开启事务
try{
//do something
$em->getConnection()->commit(); //提交事务
}catch(Exception $e){
$em->getConnection()->rollback(); //如果产生异常就返回
}
一般有一些更新操作我们会经常执行,比如创建时间,更新时间字段的记录,这里我们可以使用ORMPrePersist和ORMPreUpdate实现
前者是创建新的对象刷新数据库之前进行操作,而后者是在更新某个对象之前进行操作,比如我们可以在创建对象之后,更新数据之前,
对创建书写函数进行设置,又比如我们在更新操作执行之前,对更新时间书写函数进行自动设置,下面是例子
/**
* 在创建之前先进行的操作,记录时间
* @ORMPrePersist()
*/
public function PrePersist(){
if($this->getCreateTime() == null) { //第一次创建则更新
$this->setCreateTime(new Datetime('now'));
}
$this->setUpdateTime(new Datetime('now')); //记录更新时间
}
/**
* 在更新之前进行的操作,更新时间
* 如果有很多表都有这个操作,可以创建一个基类,有这些方法,继承即可
* @ORMPreUpdate()
*/
public function PreUpdate(){
$this->setUpdateTime(new DateTime('now'));
}