1. 程式人生 > >Doctirne---查詢更新等操作

Doctirne---查詢更新等操作

語句 public 基類 很多 oct MySQL對象 ack HERE okr

使用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 \Scourgen\WebBundle\Entity\UserRepository
     */
   protected function getUserRepository(){
       return $this->getDoctrine()->getManager()->getRepository(‘ScourgenWebBundle:User‘);
   }

   //獲取book的
    /**
     * @return \Scourgen\WebBundle\Entity\BookRepository
    
*/ 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 \Scourgen\WebBundle\Entity\Book*/ 使用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();  //如果產生異常就返回
}

一般有一些更新操作我們會經常執行,比如創建時間,更新時間字段的記錄,這裏我們可以使用ORM\PrePersist和ORM\PreUpdate實現

前者是創建新的對象刷新數據庫之前進行操作,而後者是在更新某個對象之前進行操作,比如我們可以在創建對象之後,更新數據之前,
對創建書寫函數進行設置,又比如我們在更新操作執行之前,對更新時間書寫函數進行自動設置,下面是例子

/**
     * 在創建之前先進行的操作,記錄時間
     * @ORM\PrePersist()
     */
    public function PrePersist(){
        if($this->getCreateTime() == null) {   //第一次創建則更新
            $this->setCreateTime(new \Datetime(‘now‘));
        }
        $this->setUpdateTime(new \Datetime(‘now‘));   //記錄更新時間
    }
    /**
     * 在更新之前進行的操作,更新時間
     * 如果有很多表都有這個操作,可以創建一個基類,有這些方法,繼承即可
     * @ORM\PreUpdate()
     */
    public function PreUpdate(){
        $this->setUpdateTime(new \DateTime(‘now‘));
    }

Doctirne---查詢更新等操作