PHP ORM:Doctrine、Eloquent 和 Propel 对比及示例

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

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

开始课程

ORM для PHP: сравнение Doctrine, Eloquent и Propel



对象关系映射(ORM)是一种技术,允许开发者使用面向对象的方法而非编写纯SQL查询来处理数据库。PHP有多种成熟的ORM解决方案,每种都有其优势。本文将详细比较三种最流行的ORM:Doctrine、Eloquent(来自Laravel)和Propel,并提供实际代码示例。



1. Doctrine:强大的DataMapper



Doctrine 可以说是PHP中最成熟、功能最丰富的ORM。它实现了DataMapper模式,意味着业务逻辑和数据库操作逻辑完全分离。主要特点:



  • 支持多种数据库系统(MySQL、PostgreSQL、SQLite、Oracle、MSSQL)
  • 通过DQL(Doctrine查询语言)提供灵活的查询系统
  • 内置支持迁移、事件、代理对象(延迟加载)
  • 正确配置缓存时可获得高性能


示例:定义实体与查询



// Сущность Useruse Doctrine\\ORM\\Mapping as ORM;

#[ORM\\Entity]#[ORM\\Table(name: "users")]class User{ #[ORM\\Id] #[ORM\\GeneratedValue] #[ORM\\Column(type: "integer")] private int $id;

#[ORM\\Column(type: "string", length: 100)] private string $name;

#[ORM\\Column(type: "string", length: 255, unique: true)] private string $email;

// 获取器和设置器 public function getId(): int { return $this->id; } public function getName(): string { return $this->name; } public function setName(string $name): void { $this->name = $name; } public function getEmail(): string { return $this->email; } public function setEmail(string $email): void { $this->email = $email; }}

// 通过EntityManager查询$userRepository = $entityManager->getRepository(User::class);$users = $userRepository->findBy(['name' => 'Иван'], ['id' => 'DESC'], 10);foreach ($users as $user) { echo $user->getName() . ' - ' . $user->getEmail() . PHP_EOL;}


2. Eloquent:简洁与优雅



Eloquent 是Laravel框架的标准ORM,实现了ActiveRecord模式。每个模型既是实体又是仓库。主要优点:



  • 标准操作所需代码最少
  • 优美的流畅查询构建接口
  • 内置关系映射(belongsTo、hasMany、morphMany等)
  • 优秀的文档和庞大的社区


示例:模型与查询



// 模型 User (文件 app/Models/User.php)namespace App\\Models;

use Illuminate\\Database\\Eloquent\\Model;

class User extends Model{ protected $fillable = ['name', 'email']; // 定义"一对多"关系 public function posts() { return $this->hasMany(Post::class); }}

// 在控制器中使用$users = User::where('name', 'LIKE', '%Иван%') ->orderBy('created_at', 'desc') ->limit(10) ->get();

foreach ($users as $user) { echo $user->name . ' - ' . $user->email . PHP_EOL; // 延迟加载关联记录 foreach ($user->posts as $post) { echo ' Пост: ' . $post->title . PHP_EOL; }}


3. Propel:性能与代码生成



Propel 是一款基于数据库模式(XML或YAML)生成类的ORM。它采用ActiveRecord模式,但侧重于性能和高强类型化。关键特性:



  • 生成模型类(无需手动编写获取器/设置器)
  • 内置

推荐