[031] Symfony4 数据库入门 Part02

在之前已经完成了数据库连接和创建实体后, 接下来对数据库的增删改查进行简单的使用. 主要是了解一下 Doctrine 的数据持久化操作. 操作非常简单. 先创建一个Product控制器来接收浏览器操作.

bin/console make:controller ProductController

增加/插入 数据

打开 src/Controller/ProductController.php, 添加一个 add 方法, 来实现添加数据接口.

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 的文档, 非常的丰富.

你可能感兴趣的:([031] Symfony4 数据库入门 Part02)