当前位置:首页 > PHP

php orm 实现

2026-02-28 11:48:36PHP

PHP ORM 实现方法

PHP 中实现 ORM(对象关系映射)可以通过多种方式,包括使用现成的 ORM 框架或自行实现简单的 ORM 功能。以下是几种常见的实现方法:

使用现有 ORM 框架

1. Doctrine ORM
Doctrine 是 PHP 中最流行的 ORM 框架之一,功能强大且文档完善。
安装 Doctrine ORM:

composer require doctrine/orm

基本配置示例:

use Doctrine\ORM\Tools\Setup;
use Doctrine\ORM\EntityManager;

$paths = [__DIR__ . "/src/Entity"];
$isDevMode = true;
$dbParams = [
    'driver'   => 'pdo_mysql',
    'user'     => 'root',
    'password' => '',
    'dbname'   => 'test_db',
];

$config = Setup::createAnnotationMetadataConfiguration($paths, $isDevMode);
$entityManager = EntityManager::create($dbParams, $config);

定义实体类:

php orm 实现

use Doctrine\ORM\Mapping as ORM;

/
 * @ORM\Entity
 * @ORM\Table(name="users")
 */
class User {
    /
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     */
    private $id;

    /
     * @ORM\Column(type="string")
     */
    private $name;
}

2. Eloquent ORM
Eloquent 是 Laravel 框架内置的 ORM,也可以独立使用。
安装 Eloquent:

composer require illuminate/database

基本配置示例:

php orm 实现

use Illuminate\Database\Capsule\Manager as Capsule;

$capsule = new Capsule;
$capsule->addConnection([
    'driver'    => 'mysql',
    'host'      => 'localhost',
    'database'  => 'test_db',
    'username'  => 'root',
    'password'  => '',
    'charset'   => 'utf8',
    'collation' => 'utf8_unicode_ci',
]);
$capsule->bootEloquent();

定义模型类:

use Illuminate\Database\Eloquent\Model;

class User extends Model {
    protected $table = 'users';
}

自行实现简单 ORM

1. 基础 ORM 实现
以下是一个简单的 ORM 实现示例,包含基本的 CRUD 操作:

class Database {
    private $pdo;

    public function __construct($dsn, $username, $password) {
        $this->pdo = new PDO($dsn, $username, $password);
    }

    public function query($sql, $params = []) {
        $stmt = $this->pdo->prepare($sql);
        $stmt->execute($params);
        return $stmt;
    }
}

class Model {
    protected $table;
    protected $db;

    public function __construct(Database $db) {
        $this->db = $db;
    }

    public function find($id) {
        $sql = "SELECT * FROM {$this->table} WHERE id = ?";
        return $this->db->query($sql, [$id])->fetch(PDO::FETCH_OBJ);
    }

    public function save($data) {
        $fields = implode(', ', array_keys($data));
        $placeholders = implode(', ', array_fill(0, count($data), '?'));
        $sql = "INSERT INTO {$this->table} ($fields) VALUES ($placeholders)";
        $this->db->query($sql, array_values($data));
        return $this->db->lastInsertId();
    }
}

2. 使用反射实现动态属性映射
通过反射机制动态映射数据库字段到模型属性:

class Model {
    protected $table;
    protected $attributes = [];

    public function __set($name, $value) {
        $this->attributes[$name] = $value;
    }

    public function __get($name) {
        return $this->attributes[$name] ?? null;
    }

    public function save() {
        $fields = implode(', ', array_keys($this->attributes));
        $placeholders = implode(', ', array_fill(0, count($this->attributes), '?'));
        $sql = "INSERT INTO {$this->table} ($fields) VALUES ($placeholders)";
        // 执行 SQL
    }
}

性能优化建议

  1. 使用连接池:对于高并发场景,连接池可以减少数据库连接开销。
  2. 缓存查询结果:通过缓存机制(如 Redis)缓存频繁查询的数据。
  3. 批量操作:尽量使用批量插入或更新减少数据库交互次数。

注意事项

  1. SQL 注入防护:始终使用参数化查询或预处理语句。
  2. 事务管理:复杂操作应封装在事务中确保数据一致性。
  3. 懒加载与预加载:关联数据加载时注意 N+1 问题,合理使用预加载。

以上方法涵盖了从框架到自实现的 ORM 方案,可根据项目需求选择合适的方式。

标签: phporm
分享给朋友:

相关文章

php实现分页

php实现分页

PHP实现分页的基本方法 使用原生PHP实现分页功能需要结合数据库查询和HTML展示。以下是核心实现步骤: 数据库查询与分页逻辑 // 连接数据库 $conn = new mysqli('lo…

php实现增删改查

php实现增删改查

以下是在PHP中实现增删改查(CRUD)操作的详细方法,以MySQL数据库为例: 数据库连接配置 创建config.php文件存储数据库连接信息: <?php $host = 'loca…

php实现栈

php实现栈

栈的基本概念 栈(Stack)是一种遵循后进先出(LIFO)原则的数据结构。核心操作包括: push:元素入栈。 pop:元素出栈(返回并移除栈顶元素)。 peek:查看栈顶元素(不移…

php实现登录

php实现登录

PHP 登录功能实现 数据库连接与用户表创建 创建一个数据库连接文件 db.php,用于管理数据库连接。MySQL 示例代码如下: <?php $host = 'localhost'; $d…

php 实现mvc

php 实现mvc

PHP 实现 MVC 架构的方法 MVC(Model-View-Controller)是一种常见的软件设计模式,用于分离业务逻辑、用户界面和用户输入。以下是 PHP 实现 MVC 架构的关键步骤:…

无限分类实现 php

无限分类实现 php

无限分类的实现方法 无限分类通常用于构建多层级结构的数据,如商品分类、部门架构等。以下是几种常见的实现方式: 邻接列表模式(Adjacency List) 邻接列表是最简单的实现方式,通过在每个记…