什么是 Doctrine ORM,为什么需要它?
\n\nDoctrine ORM(对象关系映射)是一个强大的 PHP 库,它允许开发者使用面向对象的方法处理数据库,而不是编写原始的 SQL 查询。Doctrine ORM 是 Symfony 的事实标准,但也可以用于任何其他 PHP 项目(Laravel、Yii、纯 PHP)。
\n\nDoctrine 解决的主要问题:关系数据模型(表、行、列)与对象模型(类、对象、属性)之间的不匹配。Doctrine 自动将 PHP 对象转换为数据库记录,反之亦然。
\n\n关键功能:
\n- \n
- 自动创建数据库模式 — 基于类中的注解/属性 \n
- Repository 模式 — 用于搜索和过滤数据的便捷方法 \n
- DQL(Doctrine 查询语言) — 面向对象的查询语言 \n
- 延迟加载 — 仅在需要时加载关联数据 \n
- 迁移 — 管理数据库模式更改 \n
- 事务 — 完全支持 ACID \n
- 缓存 — 元数据、查询、结果 \n
Doctrine ORM 适用于任何规模的项目:从小型网站到拥有数百个表的企业系统。
\n\n安装 Doctrine ORM
\n\n通过 Composer(PHP 包管理器)进行安装。在项目根目录打开终端并执行:
\n\ncomposer require doctrine/orm\n\n对于 Symfony,建议安装 DoctrineBundle 包:
\n\ncomposer require symfony/orm-pack\ncomposer require --dev symfony/maker-bundle # 用于代码生成\n\n如果您使用无框架的纯 PHP,还需要安装数据库驱动程序:
\n\ncomposer require doctrine/dbal\ncomposer require doctrine/annotations # 用于处理注解(PHP 7.4 及更低版本)\n\n对于 PHP 8+ 的属性(推荐方式):不需要注解,Doctrine 支持原生属性。
\n\n快速入门:代码示例
\n\n让我们看一个最简单的示例——创建一个“Product”实体并将其保存到数据库。
\n\n1. 创建实体类
\n\n<?php\n// src/Entity/Product.php\nnamespace App\\Entity;\n\nuse Doctrine\\ORM\\Mapping as ORM;\n\n#[ORM\\Entity]\n#[ORM\\Table(name: 'products')]\nclass Product\n{\n #[ORM\\Id]\n #[ORM\\GeneratedValue]\n #[ORM\\Column(type: 'integer')]\n private int $id;\n\n #[ORM\\Column(type: 'string', length: 255)]\n private string $name;\n\n #[ORM\\Column(type: 'float')]\n private float $price;\n\n // 获取器和设置器\n public function getId(): int\n {\n return $this->id;\n }\n\n public function getName(): string\n {\n return $this->name;\n }\n\n public function setName(string $name): self\n {\n $this->name = $name;\n return $this;\n }\n\n public function getPrice(): float\n {\n return $this->price;\n }\n\n public function setPrice(float $price): self\n {\n $this->price = $price;\n return $this;\n }\n}\n\n2. 创建并保存对象
\n\n<?php\n// 在 Symfony 控制器或任何其他地方\nuse App\\Entity\\Product;\nuse Doctrine\\ORM\\EntityManagerInterface;\n\nclass ProductController\n{\n public function createProduct(EntityManagerInterface $entityManager)\n {\n $product = new Product();\n $product->setName('笔记本电脑');\n $product->setPrice(49999.99);\n\n // 告诉 Doctrine 该对象需要保存\n $entityManager->persist($product);\n \n // 执行 INSERT