创建Entity类
Annotations
// src/AppBundle/Entity/Product.php namespace AppBundle\Entity; use Doctrine\ORM\Mapping as ORM; /** * @ORM\Entity * @ORM\Table(name="product") */ class Product { /** * @ORM\Column(type="integer") * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") */ protected $id; /** * @ORM\Column(type="string", length=100) */ protected $name; /** * @ORM\Column(type="decimal", scale=2) */ protected $price; /** * @ORM\Column(type="text") */ protected $description; }(2)生成Getter和Setter
php bin/console doctrine:generate:entities AppBundle/Entity/Product
(3)创建数据库表
php bin/console doctrine:schema:update --force(4)将对象保存到数据库
// src/AppBundle/Controller/DefaultController.php // ... use AppBundle\Entity\Product; use Symfony\Component\HttpFoundation\Response; // ... public function createAction() { $product = new Product(); $product->setName('A Foo Bar'); $product->setPrice('19.99'); $product->setDescription('Lorem ipsum dolor'); $em = $this->getDoctrine()->getManager(); $em->persist($product); $em->flush(); return new Response('Created product id '.$product->getId()); }(5)从数据库获取对象
public function showAction($id) { $product = $this->getDoctrine() ->getRepository('AppBundle:Product') ->find($id); if (!$product) { throw $this->createNotFoundException( 'No product found for id '.$id ); } // ... do something, like pass the $product object into a template }AppBundle:Product相当于AppBundle\Entity\Product
// query by the primary key (usually "id") $product = $repository->find($id); // dynamic method names to find based on a column value $product = $repository->findOneById($id); $product = $repository->findOneByName('foo'); // find *all* products $products = $repository->findAll(); // find a group of products based on an arbitrary column value $products = $repository->findByPrice(19.99);(5)利用findBy和findOneBy方法来获取有多个条件的对象
// query for one product matching by name and price $product = $repository->findOneBy( array('name' => 'foo', 'price' => 19.99) ); // query for all products matching the name, ordered by price $products = $repository->findBy( array('name' => 'foo'), array('price' => 'ASC') );(6)更新对象
public function updateAction($id) { $em = $this->getDoctrine()->getManager(); $product = $em->getRepository('AppBundle:Product')->find($id);//从doctrine中拿出对象 if (!$product) { throw $this->createNotFoundException( 'No product found for id '.$id ); } $product->setName('New product name!');//修改对象 $em->flush();//将修改的对象更新到数据库中 return $this->redirectToRoute('homepage'); }
(7)删除对象
$em->remove($product); $em->flush();(8)查找对象
$repository->find($id); $repository->findOneByName('Foo');(9)使用Doctrine的Query Builder查找对象
$repository = $this->getDoctrine() ->getRepository('AppBundle:Product'); $query = $repository->createQueryBuilder('p') ->where('p.price > :price') ->setParameter('price', '19.99') ->orderBy('p.price', 'ASC') ->getQuery(); $products = $query->getResult();(10)使用DQL查询对象
$em = $this->getDoctrine()->getManager(); $query = $em->createQuery( 'SELECT p FROM AppBundle:Product p WHERE p.price > :price ORDER BY p.price ASC' )->setParameter('price', '19.99'); $products = $query->getResult();三 Entity之间的关联
(1)关系配置
// src/AppBundle/Entity/Category.php // ... use Doctrine\Common\Collections\ArrayCollection; class Category { // ... /** * @ORM\OneToMany(targetEntity="Product", mappedBy="category") */ protected $products; public function __construct() { $this->products = new ArrayCollection(); } }
// src/AppBundle/Entity/Product.php // ... class Product { // ... /** * @ORM\ManyToOne(targetEntity="Category", inversedBy="products") * @ORM\JoinColumn(name="category_id", referencedColumnName="id") */ protected $category; }php bin/console doctrine:generate:entities AppBundle
php app/console doctrine:schema:update --force(2)保存相互关联的Entities
// ... use AppBundle\Entity\Category; use AppBundle\Entity\Product; use Symfony\Component\HttpFoundation\Response; class DefaultController extends Controller { public function createProductAction() { $category = new Category(); $category->setName('Main Products'); $product = new Product(); $product->setName('Foo'); $product->setPrice(19.99); $product->setDescription('Lorem ipsum dolor'); // relate this product to the category $product->setCategory($category); $em = $this->getDoctrine()->getManager(); $em->persist($category); $em->persist($product); $em->flush(); return new Response( 'Created product id: '.$product->getId() .' and category id: '.$category->getId() ); } }(3)获取关联对象
public function showAction($id) { $product = $this->getDoctrine() ->getRepository('AppBundle:Product') ->find($id); $categoryName = $product->getCategory()->getName(); // ... }