文章目录
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