【总结】symfony-doctrine 基本使用

Posted on Posted in 计算机2,495 views

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

        无标题1.png

        无标题2.png

2.3、新建Entity

        无标题3.png

        无标题4.png

2.4、将Entity映射到数据库

        1、根据自己需求修改Entity类;

        2、同步到数据库【Entity–》DB】

        无标题5.png

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