当前位置:首页 > 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记住密码怎么实现

使用Cookie实现记住密码功能 在PHP中,可以通过设置Cookie来记住用户的登录状态。以下是一个简单的实现方式: // 用户登录验证成功后 if ($login_success) {…

php无限分类的实现

php无限分类的实现

PHP无限分类的实现 无限分类是一种常见的树形结构数据组织方式,适用于商品分类、菜单管理、地区选择等场景。以下是几种实现方法: 递归实现法 递归是最直观的实现方式,通过函数自身调用来遍历子分类。数据…

php怎么实现登录功能

php怎么实现登录功能

数据库准备 创建用户表存储登录信息,通常包括用户名、密码(需加密)等字段。示例SQL: CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY…

php实现博客

php实现博客

使用PHP实现博客系统 数据库设计 创建数据库表存储博客文章和用户信息。常见的表包括posts(文章)和users(用户)。 CREATE TABLE users ( id INT AUTO…

php 实现单点登录

php 实现单点登录

PHP 实现单点登录的方法 单点登录(SSO)允许用户通过一次登录访问多个相互信任的系统。以下是基于 PHP 的实现方案: 基于共享 Session 的方案 在同一个主域名下的子域名间可以通过共享…

php数据库实现

php数据库实现

PHP 连接 MySQL 数据库 使用 mysqli 扩展连接 MySQL 数据库: <?php $servername = "localhost"; $username = "usernam…