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模式,但侧重于性能和高强类型化。关键特性:
- 生成模型类(无需手动编写获取器/设置器)
- 内置