在 Zend Framework 2 使用 Doctrine 2

安装
在 composer.json 中的require 加入:
"doctrine/doctrine-orm-module": "0.*"

执行: php composer.phar update
配置
  • 创建 config/autoload/doctrine.local.php

    return array(
    	'doctrine' => array(
    		'connection' => array(
        		'orm_default' => array(
            		'driverClass' =>'Doctrine\DBAL\Driver\PDOMySql\Driver',
            		'params' => array(
               			'host'     => '127.0.0.1',
                		'port'     => '3306',
                		'user'     => 'root',
                		'password' => '123123',
                		'dbname'   => 'test',
            		)
        		)
    		)
    	)
    );
    
  • 要模块目录的config/module.config.php 加入

    'doctrine' => array(
    	'driver' => array(
        	__NAMESPACE__ . '_driver' => array(
            	'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver',
            	'cache' => 'array',
            	'paths' => array(__DIR__ . '/../src/'.__NAMESPACE__.'/Entity')
        	),
        	'orm_default' => array(
            	'drivers' => array(
                	__NAMESPACE__ . '\Entity' => __NAMESPACE__ . '_driver'
            	)
        	),
    	),
    ),
    
    这个文件加设命名空间, 例如 namespace Application;
    Entity的目录位于 src目录的命名空间目录下。
    
Entity的编写
  • doctrine 命令

    验证数据表
    	./vendor/bin/doctrine-module orm:validate-schema 
    创建数据表
    	./vendor/bin/doctrine-module orm:schema-tool:create
    更新数据表结构
    	./vendor/bin/doctrine-module orm:schema-tool:update --force --dump-sql
    生成getter/setter
    	./vendor/bin/doctrine-module orm:generate:entities ./module/Application/src
    
  • 注释详解

    http://doctrine-orm.readthedocs.org/en/latest/reference/annotations-reference.html
    
  • User Entity ```php use Doctrine\ORM\Mapping as ORM; use Doctrine\Common\Collections\ArrayCollection;

    /**
     * @ORM\Entity
     * @ORM\Table(name="users")
     */
    class User {
    	/**
    	 * @ORM\Id
    	 * @ORM\GeneratedValue(strategy="AUTO")
    	 * @ORM\Column(type="bigint", name="user_id", options={"comment": "用户ID"})
    	 */
    	protected $id;
    
    	/**
    	 * @ORM\Column(type="string", name="username", nullable=false, length=30, options={"comment": "用户名"})
    	 */
    	protected $name;
    
    	/**
    	 * @ORM\Column(type="integer", name="create_time", nullable=false, options={"comment": "创建时间"})
    	 */
    	protected $created;
    
    	/**
    	 * @ORM\OneToMany(targetEntity="Bill", mappedBy="user")
    	 */
    	protected $bills;
    
    	public function __construct() {
    		$this->bills = new ArrayCollection();
    	}
    
    
    	/**
    	 * Get id
    	 *
    	 * @return integer 
    	 */
    	public function getId()
    	{
    		return $this->id;
    	}
    
    	/**
    	 * Set name
    	 *
    	 * @param string $name
    	 * @return User
    	 */
    	public function setName($name)
    	{
    		$this->name = $name;
    
    		return $this;
    	}
    
    	/**
    	 * Get name
    	 *
    	 * @return string 
    	 */
    	public function getName()
    	{
    		return $this->name;
    	}
    
    	/**
    	 * Set created
    	 *
    	 * @param integer $created
    	 * @return User
    	 */
    	public function setCreated($created)
    	{
    		$this->created = $created;
    
    		return $this;
    	}
    
    	/**
    	 * Get created
    	 *
    	 * @return integer 
    	 */
    	public function getCreated()
    	{
    		return $this->created;
    	}
    
    	/**
    	 * Add bills
    	 *
    	 * @param \Application\Entity\Bill $bills
    	 * @return User
    	 */
    	public function addBill(\Application\Entity\Bill $bills)
    	{
    		$this->bills[] = $bills;
    
    		return $this;
    	}
    
    	/**
    	 * Remove bills
    	 *
    	 * @param \Application\Entity\Bill $bills
    	 */
    	public function removeBill(\Application\Entity\Bill $bills)
    	{
    		$this->bills->removeElement($bills);
    	}
    
    	/**
    	 * Get bills
    	 *
    	 * @return \Doctrine\Common\Collections\Collection 
    	 */
    	public function getBills()
    	{
    		return $this->bills;
    	}
    }
    ```
    
  • Bill Entity

    ```php
    
    namespace Application\Entity;
    
    use Doctrine\ORM\Mapping as ORM;
    
    /**
     * @ORM\Entity
     * @ORM\Table(name="bills")
     */
    class Bill {
    
    	/**
    	 * @ORM\Id
    	 * @ORM\GeneratedValue(strategy="AUTO")
    	 * @ORM\Column(type="bigint", name="bill_id", options={"comment": "订单ID"})
    	 */
    	protected $id;
    
    	/**
    	 * @ORM\Column(type="decimal", precision=2, scale=1, options={"comment": "订单价钱"})
    	 */
    	protected $price;
    
    
    	/**
    	 * @ORM\ManyToOne(targetEntity="User", inversedBy="bills")
    	 * @ORM\JoinColumn(name="user_id", referencedColumnName="user_id")
    	 */
    	protected $user;
    
    	/**
    	 * Get id
    	 *
    	 * @return integer 
    	 */
    	public function getId()
    	{
    		return $this->id;
    	}
    
    	/**
    	 * Set price
    	 *
    	 * @param string $price
    	 * @return Bill
    	 */
    	public function setPrice($price)
    	{
    		$this->price = $price;
    
    		return $this;
    	}
    
    	/**
    	 * Get price
    	 *
    	 * @return string 
    	 */
    	public function getPrice()
    	{
    		return $this->price;
    	}
    
    	/**
    	 * Set user
    	 *
    	 * @param \Application\Entity\User $user
    	 * @return Bill
    	 */
    	public function setUser(\Application\Entity\User $user = null)
    	{
    		$this->user = $user;
    
    		return $this;
    	}
    
    	/**
    	 * Get user
    	 *
    	 * @return \Application\Entity\User 
    	 */
    	public function getUser()
    	{
    		return $this->user;
    	}
    }
    ```
    
  • Controller ```php

    $objectManager = $this->getServiceLocator()->get('Doctrine\ORM\EntityManager');
    
    //增加记录
    //增加单一记录
    /*
    $user = new User();
    $user->setName('nate');
    $user->setCreated(time());
    $objectManager->persist($user);
    $objectManager->flush();
    */
    
    //增加关联记录
    /*
    $user = new User();
    $user->setName('may');
    $user->setCreated(time());
    
    $bill = new Bill();
    $bill->setPrice(8.8);
    $bill->setUser($user);
    
    $objectManager->persist($user);
    $objectManager->persist($bill);
    $objectManager->flush();
    */
    
    /*
    //查找相关
    
    //查找不到
    $user = $objectManager->getRepository('Application\Entity\User')->find(100);
    if (! is_null($user)) {
        echo "user exists";
    } else {
        echo "user not exists";
    }
    */
    
    //查找有记录
    /*
    $user = $objectManager->getRepository('Application\Entity\User')->find(2);
    if (! is_null($user)) {
        echo $user->getId(), $user->getName(), $user->getCreated();
    } else {
        echo "user not exists";
    }
    */
    
    /*
    //一对多关系查询
    $bill = $objectManager->getRepository('Application\Entity\Bill')->find(2);
    if (! is_null($bill)) {
        echo $bill->getUser()->getName();
    }
    exit;
    */
    
    //一对多关系查询
    /*
    $user = $objectManager->getRepository('Application\Entity\User')->find(7);
    if (! is_null($user)) {
        $bills = $user->getBills();
        if (is_object($bills) && count($bills) > 0) {
            foreach ($bills as $bill) {
                echo $bill->getId(), ' # ', $bill->getPrice(), '<br/>';
            }
    
        }
    } else {
        echo "user not exists";
    }
    */
    
    /*
    //设置条件查询单条记录
    $user = $objectManager->getRepository('Application\Entity\User')->findOneBy(array(
        'name' => 'nate_2'
    ));
    if (! is_null($user)) {
        echo $user->getId(), $user->getName(), $user->getCreated();
    } else {
        echo "user not exists";
    }
    
    //设置条件准确查询多条记录
    $users = $objectManager->getRepository('Application\Entity\User')->findBy(array(
        'name' => 'nate'
    ));
    if (! is_null($users)) {
        foreach ($users as $user) {
            echo $user->getId(), $user->getName(), $user->getCreated();
        }
    } else {
        echo "user not exists";
    }
    
    //设置条件模糊查询多条记录
    $users = $objectManager->getRepository('Application\Entity\User')->createQueryBuilder('u')
        ->where('u.name like :name')
        ->setParameter('name', 'nate%')
        ->getQuery()
        ->getResult();
    if (! is_null($users) && is_array($users)) {
        foreach ($users as $user) {
            echo $user->getId(), $user->getName(), $user->getCreated();
        }
    } else {
        echo "user not exists";
    }
    
    //按ID号降序设置条件模糊查询多条记录
    $users = $objectManager->getRepository('Application\Entity\User')->createQueryBuilder('u')
        ->where('u.name like :name')
        ->setParameter('name', 'nate%')
        ->orderBy('u.id', 'desc')
        ->getQuery()
        ->getResult();
    
    if (! is_null($users) && is_array($users)) {
        foreach ($users as $user) {
            echo $user->getId(), $user->getName(), $user->getCreated();
        }
    } else {
        echo "user not exists";
    }
    */
    
    //删除记录
    /*
    $user = $objectManager->getRepository('Application\Entity\User')->find(3);
    if (! is_null($user)) {
        $objectManager->remove($user);
        $objectManager->flush();
        var_dump($user);
    }
    */
    
    //更新记录
    /*
    $user = $objectManager->getRepository('Application\Entity\User')->find(4);
    if (! is_null($user)) {
        $user->setName('may');
        $objectManager->flush();
    
        echo $user->getId(), $user->getName();
    }
    */
     ```
    
  • query-builder相关文档

    http://doctrine-orm.readthedocs.org/en/latest/reference/query-builder.html
    
0%