Doctrine ORM 用于 PHP:完整指南及示例

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

什么是 Doctrine ORM,为什么需要它?

\n\n

Doctrine ORM(对象关系映射)是一个强大的 PHP 库,它允许开发者使用面向对象的方法处理数据库,而不是编写原始的 SQL 查询。Doctrine ORM 是 Symfony 的事实标准,但也可以用于任何其他 PHP 项目(Laravel、Yii、纯 PHP)。

\n\n

Doctrine 解决的主要问题:关系数据模型(表、行、列)与对象模型(类、对象、属性)之间的不匹配。Doctrine 自动将 PHP 对象转换为数据库记录,反之亦然。

\n\n

关键功能:

\n
    \n
  • 自动创建数据库模式 — 基于类中的注解/属性
  • \n
  • Repository 模式 — 用于搜索和过滤数据的便捷方法
  • \n
  • DQL(Doctrine 查询语言) — 面向对象的查询语言
  • \n
  • 延迟加载 — 仅在需要时加载关联数据
  • \n
  • 迁移 — 管理数据库模式更改
  • \n
  • 事务 — 完全支持 ACID
  • \n
  • 缓存 — 元数据、查询、结果
  • \n
\n\n

Doctrine ORM 适用于任何规模的项目:从小型网站到拥有数百个表的企业系统。

\n\n

安装 Doctrine ORM

\n\n

通过 Composer(PHP 包管理器)进行安装。在项目根目录打开终端并执行:

\n\n
composer require doctrine/orm
\n\n

对于 Symfony,建议安装 DoctrineBundle 包:

\n\n
composer require symfony/orm-pack\ncomposer require --dev symfony/maker-bundle  # 用于代码生成
\n\n

如果您使用无框架的纯 PHP,还需要安装数据库驱动程序:

\n\n
composer require doctrine/dbal\ncomposer require doctrine/annotations  # 用于处理注解(PHP 7.4 及更低版本)
\n\n

对于 PHP 8+ 的属性(推荐方式):不需要注解,Doctrine 支持原生属性。

\n\n

快速入门:代码示例

\n\n

让我们看一个最简单的示例——创建一个“Product”实体并将其保存到数据库。

\n\n

1. 创建实体类

\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\n

2. 创建并保存对象

\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                    

推荐