文章目录
2016-01-14 by xiaoxia
一、环境
1、系统:Linux ubuntu 3.13.0-32-generic x86_64 GNU/Linux
2、PHP:PHP 5.5.9-1
3、MySQL:mysql Ver 14.14 Distrib 5.5.43
4、Symfony:Symfony version 2.7.6
5、doctrine:2
二、ORM(对象关系映射) 建立
2.1、数据库链接配置
文件:./app/config/parameters.yml
parameters: database_driver: pdo_mysql database_host: localhost database_port: 3306 database_name: XGC database_user: root database_password: 'root' mailer_transport: smtp mailer_host: 127.0.0.1 mailer_user: null mailer_password: null locale: zh_CN secret: 5528ad9e524432c85485b11e734dcc9c9b2670b5
2.2、新建Bundle
2.3、新建Entity
2.4、将Entity映射到数据库
1、根据自己需求修改Entity类;
2、同步到数据库【Entity–》DB】
2.5、将数据库表结构的更新同步到Entity
1、更新映射orm.yml文件:
app/console doctrine:mapping:import --force CellcomDBBundle yml
2、由yml文件生成实体Entity
app/console doctrine:generate:entities CellcomDBBundle --no-backup
2.6、自动生成 增删改查操作
没用用到,不做多介绍,命令如下:
app/consloe generate:doctrine:crud
2.7、补充
1、可以理解为: Entity –》orm.yml–》–》[ORM]–》DB;
2、所以上面的 Entity、orm.yml 虽然是自动生成的,但可以手动灵活配置的;
3、doctrine是一个独立的ORM,不依赖Symfony框架,所以可以应用到其他框架(没有真正实践过)。
三、doctrine数据操作
3.1、主要结构介绍
1、EntityManager (实体管理) Doctrine\ORM\EntityManager
主要用于实体的管理。常用的默认的方法有:
public function getConnection(); public function createQuery($dql = ''); public function createNativeQuery($sql, ResultSetMapping $rsm); public function createQueryBuilder(); public function persist($entity); public function flush($entity = null); public function find($entityName, $id, $lockMode = LockMode::NONE, $lockVersion = null); public function getRepository($entityName);
A、Controller中调用
$em = $this->getDoctrine()->getEntityManager();
B、在服务中调用,思想是将其作为参数传入到服务容器中。所以配置服务时配置如下
UploadFile: class: Cellcom\Service\UploadFile\File arguments: ["@doctrine.orm.entity_manager"]
然后在服务类的构造函数中接收
protected $em; public function __construct($em) { $this->em = $em; }
2、Repository(对象操作集合)
主要是数据操作的一些方法统一的封装,可以自己来自定义相关的方法。常用的默认的对象操作集合有:
$repository->find($id); $repository->findAll(); $repository->findOneByName(‘Foo’); $repository->findAllOrderedByName(); $repository->findOneBy(array(‘name’ => ‘foo’, ‘price’ => 19.99)); $repository->findBy(array(‘name’ => ‘foo’),array(‘price’ => ‘ASC’));
A、在Controller中调用:
$repository = $this->getDoctrine()->getRepository('CellcomDBBundle:UploadFile'); //或者 $em = $this->getDoctrine()->getEntityManager(); $repository = $em->getRepository(‘CellcomDBBundle:UploadFile’);
B、 在服务中调用,思想是同EntityManager。
3、补充
EntityManager和Repository都是可以直接在Symfony中的Container中获取的,如EntityManager在app.php中可以通过如下方法获取:
$kernel->getContainer()->get('doctrine.orm.entity_manager');
这对于架构来说非常方便,可以在单例模式中得到很好的利用。同样的获取到了EntityManager就可以很容易的获取到Repository。
3.2、关于查询
注意:以下代码来源于工程,getDBRepository、getEM是自定义函数,功能根据函数名易见。
1、使用Repository进行查询
public function test4($id) { $res = $this->getDBRepository('CellcomDBBundle:Student') ->findBy( array('grade'=>$id,), null, 10, 0); return $res; }
2、使用QueryBuilder进行拼装dql查询
public function test($id) { $repository = $this->getDBRepository('CellcomDBBundle:Student'); $query = $repository->createQueryBuilder('p') ->where('p.grade = :grade') ->setParameter('grade', $id)//设置占位符的值 ->setFirstResult(0) ->setMaxResults(10) ->getQuery(); $res = $query->getResult(); //返回的是实体对象,如果要强制转换成Array的话,必须将实体类属性的访问权限设置为public。 return $res; }
3、使用DQL进行createQuery($dql)进行查询
public function test3($id) { $em = $this->getEM(); $query = $em->createQuery( 'SELECT p FROM CellcomDBBundle:Student p WHERE p.grade = :grade' ) ->setParameter('grade', $id) ->setMaxResults(10); $res = $query->getResult(); return $res; }
4、使用EntityManager直接进行find查询
5、使用原生的sql进行createNativeQuery($sql)进行查询
public function test($id) { $rsm = new ResultSetMapping; $rsm->addEntityResult('Cellcom\DBBundle\Entity\Student', 's'); $rsm->addFieldResult('s', 'sid', 'sid'); //($alias, $columnName, $fieldName) $rsm->addFieldResult('s', 'name', 'name'); $rsm->addFieldResult('s', 'grade', 'grade'); $rsm->addFieldResult('s', 'class', 'class'); $rsm->addFieldResult('s', 'tid', 'tid'); $query = $this->getEM()->createNativeQuery( "SELECT * FROM student m WHERE m.grade LIKE :sgrade LIMIT 0,10 ",$rsm); $query->setParameters(['sgrade' => $id,]); $rows = $query->getResult(); return $rows; }
注意:前面的查询返回来的都是实体对象,这种查询方法返回来的是数组,按个人喜好来选择。不过在前台TWIG模板中调用方法都是一样的格式: XX.属性
6、聚合函数的查询
public function searchStudentCount(array $conditions) { $rsm = new ResultSetMapping(); $rsm->addScalarResult('scount', 'scount', 'integer'); $query = $this->getEM()->createNativeQuery( "SELECT count(sid) as scount FROM student m WHERE (m.sid LIKE :sid or '-1' = :sid ) AND (m.name LIKE :sname or '-1' = :sname) AND (m.grade LIKE :sgrade or '-1' = :sgrade) ",$rsm); $query->setParameters([ 'sid' => $conditions['id'], 'sname' => $conditions['name'], 'sgrade' => $conditions['grade'], ]); $rows = $query->getResult(); return empty($rows)?0:$rows['scount']; }
7、连接查询
两种想法:
A、通过doctrine实体中一个对象作为另一个对象的属性;
B、使用createNativeQuery来构造;
3.3、关于增、删、改
1、增
$uf = new UploadFile(); $uf->setName('jun'); $uf->setUfkey('xia'); $uf->setType('feng'); $em = $this->getDoctrine()->getEntityManager(); $em->persist($uf); $em->flush();
2、删
$em = $this->getDoctrine()->getManager(); $uf = $em->getRepository('CellcomDBBundle:UploadFile')->findOneById(1); $em->remove($uf); $em->flush();
3、改
$em = $this->getDoctrine()->getManager(); $uf = $em->getRepository('CellcomDBBundle:UploadFile')->findOneById(1); $uf->setName("xia"); $em->flush();
3.4、关于事务
四、
九、参考
1、系统介绍Doctrine:http://www.imooc.com/video/6113
2、Symfony中使用:http://symfony.com/doc/2.7/book/doctrine.html
3、较深入介绍:http://firehare.blog.51cto.com/809276/585477
4、全面使用:http://www.cnblogs.com/yjf512/p/3375614.html
转载标明出处:https://blog.evanxia.com/2016/02/118