使用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---查询更新等操作的更多相关文章

  1. 在SqlServer查询分析器里 访问远程数据库 进行数据查询更新等操作(openrowset)

    启用Ad Hoc Distributed Queries: exec sp_configure 'show advanced options',1 reconfigure exec sp_config ...

  2. MongoDB中的映射,限制记录和记录拼排序 文档的插入查询更新删除操作

    映射 在 MongoDB 中,映射(Projection)指的是只选择文档中的必要数据,而非全部数据.如果文档有 5 个字段,而你只需要显示 3 个,则只需选择 3 个字段即可. find() 方法 ...

  3. C#通过SqlConnection连接查询更新等操作Sqlserver数据库

    Sqlserver数据库连接方式有多种,这里只介绍最常用的通过SqlConnection和Sqlserver数据库用户名和密码验证来进行操作数据库. 数据库连接字符串: string connStri ...

  4. Yii数据库操作增删改查-[增加\查询\更新\删除 AR模式]

    在Yii的开发中常常需要去使用Yii的增删改查方法,这些方法又可以多次变化和组合,带来全方位的实现对数据库的处理,下面对这些方法做一些简单的整理和梳理,有遗漏或是BUG,敬请指出.灰常感谢!!! 一. ...

  5. es 查询更新操作

    # es 查询更新操作# _*_ coding: utf-8 _*_ import time import datetime import pymysql from elasticsearch imp ...

  6. Hudi 数据湖的插入,更新,查询,分析操作示例

    Hudi 数据湖的插入,更新,查询,分析操作示例 作者:Grey 原文地址: 博客园:Hudi 数据湖的插入,更新,查询,分析操作示例 CSDN:Hudi 数据湖的插入,更新,查询,分析操作示例 前置 ...

  7. PHP5: mysqli 插入, 查询, 更新和删除 Insert Update Delete Using mysqli (CRUD)

    原文: PHP5: mysqli 插入, 查询, 更新和删除  Insert Update Delete Using mysqli (CRUD) PHP 5 及以上版本建议使用以下方式连接 MySQL ...

  8. LINQ to SQL更新数据库操作(转载)

    使用LINQ to SQL建模Northwind数据库 在这之前一起学过LINQ to SQL设计器的使用,下面就使用如下的数据模型: 当使用LINQ to SQL设计器设计以上定义的五个类(Prod ...

  9. mysql查询更新时的锁表机制分析

    为了给高并发情况下的mysql进行更好的优化,有必要了解一下mysql查询更新时的锁表机制. 一.概述 MySQL有三种锁的级别:页级.表级.行级.MyISAM和MEMORY存储引擎采用的是表级锁(t ...

  10. mysql查询更新时的锁表机制分析(只介绍了MYISAM)

    为了给高并发情况下的mysql进行更好的优化,有必要了解一下mysql查询更新时的锁表机制. 一.概述 MySQL有三种锁的级别:页级.表级.行级.MyISAM和MEMORY存储引擎采用的是表级锁(t ...

随机推荐

  1. python学习日记(isinstance和issubclass)

    isinstance(obj,cls)检查是否obj是否是类 cls 的对象 class Foo(object): pass obj = Foo() isinstance(obj, Foo) issu ...

  2. java jdbc ResultSet结果通过java反射赋值给java对象

    在不整合框架的情况下,使用jdbc从数据库读取数据时都得一个个的get和set,不仅累代码还显得不简洁,所以利用java的反射机制写了一个工具类,这样用jdbc从数据库拿数据的时候就不用那么麻烦了. ...

  3. tf.reducemean()到底是什么意思?

    https://blog.csdn.net/he_min/article/details/78694383 在tensorflow中经常见到reducemean这个api,到底有什么用,到底是对谁求均 ...

  4. echarts 修改y轴name的样式

    option = {    xAxis: {        type: 'category',        data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sa ...

  5. 浏览器开发者工具----F12 功能介绍

    笔者技巧: 看了些其它回答,有些是用来扒图片的,有些是写爬虫的(这个不要看Elements,因为浏览器会对一些不符合规范的标签做补全或者其它处理,最好是Ctrl+U). 图片的话就不要看Network ...

  6. python4 分支结构,循环结构 for循环

    ## 复习 ```python'''1.变量名命名规范 -- 1.只能由数字.字母 及 _ 组成 -- 2.不能以数字开头 -- 3.不能与系统关键字重名 -- 4._开头有特殊含义 -- 5.__开 ...

  7. Numpy 系列(八)- 广播机制

    什么是广播 我们都知道,Numpy中的基本运算(加.减.乘.除.求余等等)都是元素级别的,但是这仅仅局限于两个数组的形状相同的情况下. 可是大家又会发现,如果让一个数组加1的话,结果时整个数组的结果都 ...

  8. Gram 矩阵与向量到子空间的距离

    设 $W$ 是 $n$ 维 Euclidean 空间 $V$ 的子空间, $\beta\in V$, 定义 $\beta$ 到 $W$ 的距离  $$\bex  \rd (\beta,W)=|\bet ...

  9. django drf 基础学习5

    一 简介: 用户登录的验证 二 验证机制:    1 session session需要在服务端存储能够通过session_id而获取的信息,每次请求到达服务端时,需要根据session_id这个ke ...

  10. Ansible------角色

    什么是角色 角色是一种解决问题的思想,也是一种规范. 目录 角色的目录结构如下: files: 存放由copy或script模块等调用的文件. templates: template模块查找所需要模板 ...