在之前已经完成了数据库连接和创建实体后, 接下来对数据库的增删改查进行简单的使用. 主要是了解一下 Doctrine 的数据持久化操作. 操作非常简单. 先创建一个Product控制器来接收浏览器操作.
bin/console make:controller ProductController
增加/插入 数据
打开 src/Controller/ProductController.php
, 添加一个 add 方法, 来实现添加数据接口.
<?php
namespace App\Controller;
use App\Entity\Product;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
class ProductController extends AbstractController
{
/**
* @Route("/product/add", name="url_product_add")
*
* @return Response
*/
public function add()
{
//获取实体管理器
$entityManager = $this->getDoctrine()->getManager();
//创建商品实体
$product = new Product();
$product->setName('Product-' . mt_rand(100, 999));
$product->setPrice(mt_rand(10, 9999));
//标记准备持久化实体数据
$entityManager->persist($product);
//写入到数据库中
$entityManager->flush();
return new Response('Added new product with id: ' . $product->getId() );
}
}
启动服务器
bin/console server:run
, 访问: http://localhost:8000/product/add 数据库中会新增商品记录数据.
使用 Doctrine 提供的命令行工具也可以简单的查询SQL, 查看刚才的数据插入效果:
$ bin/console doctrine:query:sql 'SELECT * FROM product'
查询数据
再添加一个 show 接口, 来展示对应ID的商品名称:
/**
* @Route("/product/show/{id}", name="url_product_show")
*
* @param int $id
* @return Response
*/
public function show($id)
{
//根据商品ID查询商品信息到实体对象
$product = $this->getDoctrine()->getRepository(Product::class)->find($id);
//监测查询结果
if (!$product instanceof Product) {
throw $this->createNotFoundException(
'No product found for id: ' . $id
);
}
return new Response('The product name: ' . $product->getName());
}
通过访问 http://localhost:8000/product/show/1 来查看之前添加商品的名称.
修改信息
添加一个 update 接口, 修改商品ID为1的名称为: New name {id}
/**
* @Route("/product/update/{id}", name="url_product_update")
*
* @param int $id
* @return Response
*/
public function update($id)
{
$entityManager = $this->getDoctrine()->getManager(); //实体管理器
//根据商品ID查询商品信息到实体对象
$product = $entityManager->getRepository(Product::class)->find($id);
//监测查询结果
if (!$product instanceof Product) {
throw $this->createNotFoundException('No product found for id: ' . $id);
}
//修改名称
$product->setName('New name ' . $id);
//保存到数据库
$entityManager->persist($product);
$entityManager->flush();
return new Response('Product name update to: ' . $product->getName());
}
通过访问 http://localhost:8000/product/update/1 来修改之前添加商品的名称.
删除信息
添加一个 delete 接口, 实现删除商品操作
/**
* @Route("/product/delete/{id}", name="url_product_delete")
*
* @param int $id
* @return Response
*/
public function delete($id)
{
$entityManager = $this->getDoctrine()->getManager(); //实体管理器
//根据商品ID查询商品信息到实体对象
$product = $entityManager->getRepository(Product::class)->find($id);
//监测查询结果
if (!$product instanceof Product) {
throw $this->createNotFoundException('No product found for id: ' . $id);
}
//删除
$entityManager->remove($product);
$entityManager->flush();
return new Response('Product was deleted: ' . $product->getName());
}
通过访问 http://localhost:8000/product/delete/1 来删除之前添加商品编号为1的信息.
复杂的查询
在这之前的数据查询都是非常简单的. 正式在项目中遇到的查询都是比较复杂的. 多条件关联的. 这个时候可以在 Repository 中进行扩展.
先实现一个查询: "查询价格大于指定价格的商品信息, 商品按价格升序排列. ", 我们可以定义一个方法: getAllGreaterThanPrice($price)
在 ProductRepository
中.
// src/Repository/ProductRepository.php
// ...
/**
* @param $price
* @return Product[]
*/
public function getAllGreaterThanPrice($price): array
{
$qb = $this->createQueryBuilder('p')
->andWhere('p.price > :price')
->setParameter('price', $price)
->orderBy('p.price', 'ASC')
->getQuery();
return $qb->execute();
}
定义好后, 在Controller中就可以方便的调用.
$minPrice = 1000;
$products = $this->getDoctrine()
->getRepository(Product::class)
->getAllGreaterThanPrice($minPrice);
关于 DQL 和 SQL
DQL 和 SQL 语法比较相似. 具体可以参考: Doctrine Query Language DQL 在复杂的查询中使用.
我们用DQL语句再次重写上面的查询方法:
/**
* @param $price
* @return Product[]
*/
public function getAllGreaterThanPrice($price): array
{
// $qb = $this->createQueryBuilder('p')
// ->andWhere('p.price > :price')
// ->setParameter('price', $price)
// ->orderBy('p.price', 'ASC')
// ->getQuery();
//
// return $qb->execute();
$entityManager = $this->getEntityManager();
$query = $entityManager->createQuery(
'SELECT P FROM App\Entity\Product p WHERE p.price > :price ORDER BY p.price ASC'
)->setParameter('price', $price);
return $query->execute();
}
用 SQL 来实现查询, SQL 查询返回的是数组, 非实体对象数组.
/**
* @param $price
* @return array
*/
public function getAllGreaterThanPrice($price): array
{
$conn = $this->getEntityManager()->getConnection();
$sql = 'SELECT * FROM product p WHERE p.price > :price ORDER BY p.price ASC';
$stmt = $conn->prepare($sql);
$stmt->execute(['price' => $price]);
return $stmt->fetchAll();
}
数据库的基本操作到此就有个大概的概念, 具体的API需要查阅 Doctrine 的文档, 非常的丰富.
网友评论