php orm 实现
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);
定义实体类:

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
基本配置示例:

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
}
}
性能优化建议
- 使用连接池:对于高并发场景,连接池可以减少数据库连接开销。
- 缓存查询结果:通过缓存机制(如 Redis)缓存频繁查询的数据。
- 批量操作:尽量使用批量插入或更新减少数据库交互次数。
注意事项
- SQL 注入防护:始终使用参数化查询或预处理语句。
- 事务管理:复杂操作应封装在事务中确保数据一致性。
- 懒加载与预加载:关联数据加载时注意 N+1 问题,合理使用预加载。
以上方法涵盖了从框架到自实现的 ORM 方案,可根据项目需求选择合适的方式。






