PHP的ORM:对比与示例
ORM(对象关系映射)是PHP代码与关系型数据库之间的中间层。它将数据表的行转换为对象,将SQL查询转换为方法。PHP有多个成熟的ORM解决方案。本文将解析其中最流行的三个:Doctrine、Eloquent(来自Laravel)和Cycle。您将了解它们的理念、语法,并获得现成的代码示例。
1. Doctrine ORM — Data Mapper
Doctrine是PHP中最强大、最成熟的ORM。它使用Data Mapper模式:实体(Entity)不了解数据库,所有数据库操作通过仓库和实体管理器EntityManager完成。
// Doctrine中的实体示例
use Doctrine\\ORM\\Mapping as ORM;
/**
* @ORM\\Entity
* @ORM\\Table(name="users")
*/
class User
{
/** @ORM\\Id @ORM\\Column(type="integer") @ORM\\GeneratedValue */
private int $id;
/** @ORM\\Column(type="string", length=100) */
private string $name;
public function getName(): string
{
return $this->name;
}
public function setName(string $name): void
{
$this->name = $name;
}
}
// 保存和获取
$user = new User();
$user->setName('阿列克谢');
$entityManager->persist($user);
$entityManager->flush();
$users = $entityManager->getRepository(User::class)->findAll();2. Eloquent ORM — Active Record
Eloquent是Laravel框架中的ORM。它使用Active Record模式:每个对象都知道如何将自己保存到数据库。代码简洁直观,非常适合快速开发。
// Eloquent模型
use Illuminate\\Database\\Eloquent\\Model;
class User extends Model
{
protected $table = 'users';
protected $fillable = ['name'];
}
// 创建记录
$user = User::create(['name' => '玛丽亚']);
// 读取
$users = User::where('name', 'like', '%玛%')->get();
foreach ($users as $user) {
echo $user->name;
}
// 更新
$user = User::find(1);
$user->name = '奥尔加';
$user->save();3. Cycle ORM — 混合方法
Cycle是来自Spiral框架作者开发的现代ORM。它结合了Data Mapper和Active Record的最佳特性。通过模式缓存和避免魔法,运行速度比Doctrine更快。支持严格类型。
// Cycle实体
use Cycle\\Annotated\\Annotation as Cycle;
/**
* @Cycle\\Entity
* @Cycle\\Table(name="users")
*/
class User
{
/** @Cycle\\Column(type="primary") */
public int $id;
/** @Cycle\\Column(type="string") */
public string $name;
}
// 保存
$user = new User();
$user->name = '伊万';
$orm->persist($user);
$orm->run();
// 查询
$users = $orm->getRepository(User::class)->select()->fetchAll();PHP的ORM对比
| 特性 | Doctrine | Eloquent | Cycle |
|---|---|---|---|
| 模式 | Data Mapper | Active Record | 混合 |
| 性能 | 中等 | 高(带缓存) | 高 |
| 框架关联 | 独立 | Laravel | Spiral / 独立 |
| 迁移生成 | 内置 | 通过Artisan |
图书馆中也有推荐 |