Flight Active Record
Active Record 将数据库实体映射到 PHP 对象。如果你在数据库中有 users 表,可以将其中的一行"翻译"为 User 类和一个 $user 对象。
点击 GitHub 查看仓库。
基本示例
假设你有 users 表(id, name, password):
/** @property int $id @property string $name @property string $password */
class User extends flight\ActiveRecord {
public function __construct($database_connection) {
parent::__construct($database_connection, 'users');
}
}
$user = new User($pdo_connection);
$user->name = 'Bobby Tables';
$user->password = password_hash('some cool password');
$user->insert(); // 或 $user->save();
echo $user->id; // 1
// 查询
$user->find(1);
echo $user->name; // 'Bobby Tables'
// 查找所有
$users = $user->findAll();
// 条件查询
$users = $user->like('name', '%mamma%')->findAll();
安装
composer require flightphp/active-record
可独立使用或在 Flight 中注册为服务:Flight::register('user', 'User', [$pdo_connection]);
Runway 命令
php runway make:record users # 自动生成 UserRecord.php
CRUD 方法
find($id)— 查找一条,支持前置条件:$user->notNull('password')->orderBy('id DESC')->find();findAll()— 查找所有insert()— 插入(支持 UUID 主键)update()— 更新save()— 自动判断插入/更新delete()— 删除(支持前置条件批量删)dirty(array)/copyFrom(array)— 脏数据管理reset(bool)— 重置记录状态isHydrated()/isDirty()— 状态检查
查询方法
select(), from(), join(), where(), group(), order(), limit()
注意:不要在 where() 中拼接用户输入,使用 eq(), like() 等安全方法。
WHERE 条件
eq(), ne(), isNull(), notNull(), gt(), lt(), ge(), le(), like(), in(), between()
支持 OR:$user->eq('id', 1)->eq('name', 'demo', 'OR')->find();
关系
protected array $relations = [
'contacts' => [ self::HAS_MANY, Contact::class, 'user_id' ],
'contact' => [ self::HAS_ONE, Contact::class, 'user_id' ],
];
// 使用: foreach($user->contacts as $contact) { ... }
支持 HAS_MANY、HAS_ONE、BELONGS_TO。支持预加载(Eager Loading):$users = $user->with('contacts')->findAll(); 解决 N+1 问题。
事件
onConstruct, beforeFind, afterFind, beforeFindAll, afterFindAll, beforeInsert, afterInsert, beforeUpdate, afterUpdate, beforeSave, afterSave, beforeDelete, afterDelete
数据库连接管理
三种方式:构造函数传入、$config['connection']、setDatabaseConnection()。可通过在 Flight 中注册 db 服务并利用 onConstruct 事件自动连接。
许可证
MIT