PHP的ORM:Doctrine、Eloquent和Cycle对比——代码示例

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

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

开始课程

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

推荐