Doctirne---查詢更新等操作
阿新 • • 發佈:2019-03-08
語句 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---查詢更新等操作