php实现orm
PHP 实现 ORM 的方法
ORM(Object-Relational Mapping)是将数据库表映射为对象的技术,简化数据库操作。以下是几种 PHP 实现 ORM 的方式:
使用现有 ORM 框架
成熟的 ORM 框架提供完整功能,如 Doctrine 或 Eloquent(Laravel 内置)。以下是 Doctrine 的简单示例:
// 定义实体类
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;
}
// 使用
$entityManager->persist($user);
$entityManager->flush();
手动实现简单 ORM
对于轻量需求,可以手动封装数据库操作:
class BaseModel {
protected $table;
protected $db;
public function __construct($db) {
$this->db = $db;
}
public function find($id) {
$stmt = $this->db->prepare("SELECT * FROM {$this->table} WHERE id = ?");
$stmt->execute([$id]);
return $stmt->fetch(PDO::FETCH_OBJ);
}
}
class User extends BaseModel {
protected $table = 'users';
}
使用 PDO 扩展
PDO 提供数据库抽象层,适合基础 ORM 功能:
class User {
public static function getById($id) {
$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = ?");
$stmt->execute([$id]);
return $stmt->fetchObject(__CLASS__);
}
}
实现 Active Record 模式
Active Record 模式将数据和行为结合:
class User {
public $id;
public $name;
public function save() {
$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
if ($this->id) {
$stmt = $pdo->prepare("UPDATE users SET name = ? WHERE id = ?");
$stmt->execute([$this->name, $this->id]);
} else {
$stmt = $pdo->prepare("INSERT INTO users (name) VALUES (?)");
$stmt->execute([$this->name]);
$this->id = $pdo->lastInsertId();
}
}
}
使用 Data Mapper 模式
Data Mapper 分离数据与业务逻辑:
class UserMapper {
private $pdo;
public function __construct(PDO $pdo) {
$this->pdo = $pdo;
}
public function save(User $user) {
if ($user->getId()) {
$stmt = $this->pdo->prepare("UPDATE users SET name = ? WHERE id = ?");
$stmt->execute([$user->getName(), $user->getId()]);
} else {
$stmt = $this->pdo->prepare("INSERT INTO users (name) VALUES (?)");
$stmt->execute([$user->getName()]);
$user->setId($this->pdo->lastInsertId());
}
}
}
选择方案时应考虑项目规模、性能需求和团队熟悉度。成熟框架适合复杂项目,手动实现适合简单需求或学习目的。







