Doctirne---查询更新等操作 使用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'));
    }