tarasmatskovich / house-orm
PHP ORM库
Requires
- php: ^7.1
- ext-json: *
- ext-pdo: *
- predis/predis: ^1.1
- psr/log: ^1.1
- tarasmatskovich/annotations: ^1.9
Requires (Dev)
- phpunit/phpunit: 5.4.6
This package is auto-updated.
Last update: 2024-09-07 19:44:21 UTC
README
House ORM是一个简单的PHP对象关系映射库,用于与数据库中的数据进行工作。
可用驱动
- 内存(用于测试环境)
- MySQL
安装
composer require tarasmatskovich/house-orm
用法
例如,在数据库中存在一个名为users的表,具有字段id和name。您必须创建相应的实体类并指定字段映射
<?php use houseorm\mapper\annotations\Gateway; use houseorm\mapper\annotations\Field; /** * Class User * @package house\Entities\User * @Gateway(type="datatable.users") */ class User implements UserInterface { /** * @var int * @Field(map="id") */ private $id; /** * @var null|string * @Field(map="name") */ private $name; /** * User constructor. * @param null $name */ public function __construct($name = null) { $this->name = $name; } /** * @return int */ public function getId() { return $this->id; } /** * @return string */ public function getName() { return $this->name; } }
实体类的重要部分是文档注解。它用于映射。指定实体注解的第一种类型是格式中的Gateway。
* @Gateway(type="datatable.tablename")
例如,如果您在数据库中有一个名为users的表,您必须编写
* @Gateway(type="datatable.users")
实体注解的第二种类型是Field
* @Field(map="column_name")
您应该在要映射的实体类字段上指定此注解
` /** * @Field(map="name") */ private $name;
然后,您必须创建一个用于处理相应实体的存储库(映射器)类,该类扩展houseorm/mapper/DomainMapper类。让我们以users为例继续
<?php namespace house\Repositories\UserRepository; use houseorm\mapper\DomainMapper; /** * Class UserRepository * @package house\Repositories */ class UserRepository extends DomainMapper implements UserRepositoryInterface { }
然后您应该在实体管理器中注册此存储库(映射器)。这是配置参数
use houseorm\config\Config; $configParams = [ 'driver' => Config::DRIVER_MYSQL, 'host'=> '127.0.0.1', 'database' => 'orm', 'user' => 'root', 'password' => '' ];
House ORM有两个驱动。第一个是用于真实MySQL数据库的驱动
Config::DRIVER_MYSQL
第二个是用于测试的驱动(所有数据将保存在PHP进程内存中,您不需要真实数据库)
Config::DRIVER_MEMORY
创建实体管理器并注册UserRepository和User实体
use houseorm\config\Config; use houseorm\EntityManager; use house\Repositories\UserRepository; $configParams = [ 'driver' => Config::DRIVER_MYSQL, 'host'=> '127.0.0.1', 'database' => 'orm', 'user' => 'root', 'password' => '' ]; $config = new Config($configParams); $houseEntityManager = new EntityManager($config); $houseEntityManager->setMapper('User', new UserRepository(User::class));
然后您可以访问存储库
$userRepository = $entityManager->getMapper('User');
查找
要查找具有主键(默认id)的用户实体
$user = $userRepository->find(5); if (null !== $user) { $user->getId(); // 5 $user->getName(); // my name }
您还可以通过条件查找实体
$user = $userRepository->findOneBy(['name' => 'Test name'); ... $users = $userRepository->findBy([['name', 'LIKE', '%name%']); foreach ($users as $user) { // }
保存
要保存新实体,您必须创建实体类的新对象,填写字段并通过存储库保存
$user = new User(); $user->setName('Test name'); $userRepository->save($user); $user->getId() // 6 $user->getName() // Test name
更新
要更新实体,您可以更改一些字段并通过存储库保存实体对象
$user->setName('Updated name'); $userRepository->save($user); ... $user = $userRepository->find(6); $user->getName(); // Updated name
删除
要删除实体
$user = $userRepository->find(6); if (null !== $user) { $userRepository->delete($user); }
关系
为了指定关系,您必须使用特殊的注解。存在两种类型的关系
- 简单关系(例如,表comments具有字段user_id,它直接与表users和字段id相关)
- 复杂关系,需要额外的绑定表(例如,存在表users、roles和绑定表user_roles,它具有绑定字段user_id和role_id,这些字段分别与users和roles表中的id字段相关)
简单关系
通过特殊的注解指定。这是我们的用户示例。用户实体类
use houseorm\mapper\annotations\Relation; /** * Class User * @package house\Entities\User * @Gateway(type="datatable.users") */ class User implements UserInterface { /** * @var int * @Field(map="id") * @Relation(entity="Comment", key="userId") */ private $id; ... }
* @Relation(entity="Entity key in entity manager", key="related field in this entity")
和新实体Comment类
<?php use houseorm\mapper\annotations\Gateway; use houseorm\mapper\annotations\Field; use houseorm\mapper\annotations\Relation; /** * Class Comment * @package house\Entities\Comment * @Gateway(type="datatable.comments") */ class Comment implements CommentInterface { ... /** * @var null|int * @Field(map="user_id") * @Relation(entity="User", key="id") */ private $userId; ... }
复杂关系
要指定复杂关系,您必须使用特殊的注解《ViaRelation》。示例 - 实体《Role》通过绑定实体《UserRole》与《User》相关联
use houseorm\mapper\annotations\ViaRelation; /** * Class User * @package house\Entities\User * @Gateway(type="datatable.users") * @ViaRelation(entity="Role", via="UserRole", firstLocalKey="id", firstForeignKey="userId", secondLocalKey="id", secondForeignKey="roleId") */ class User implements UserInterface
UserRole实体
<?php namespace house\Entities\UserRole; use houseorm\mapper\annotations\Gateway; use houseorm\mapper\annotations\Field; use houseorm\mapper\annotations\Relation; /** * Class UserRole * @package house\Entities\UserRole * @Gateway(type="datatable.user_roles") */ class UserRole implements UserRoleInterface { /** * @var int * @Field(map="id") */ private $id; /** * @var int * @Field(map="user_id") * @Relation(entity="User", key="id") */ private $userId; /** * @var int * @Field(map="role_id") * @Relation(entity="Role", key="id") */ private $roleId; ... }
Role实体类
<?php namespace house\Entities\Role; use houseorm\mapper\annotations\Gateway; use houseorm\mapper\annotations\Field; /** * Class Role * @package house\Entities\Role * @Gateway(type="datatable.roles") */ class Role implements RoleInterface { /** * @var int * @Field(map="id") */ private $id; /** * @var string * @Field(map="title") */ private $title; ... }
缓存
您可以使用缓存来提高ORM的工作性能。House ORM支持两种缓存驱动
- 内存缓存(用于异步PHP)
- 使用内存缓存
use houseorm\Cache\Config\CacheConfig; use houseorm\config\Config; use houseorm\EntityManager; $config = new Config($configParams); $config->setCacheConfig(new CacheConfig(CacheConfig::MEMORY_DRIVER)); $entityManager = new EntityManager($config);
使用Redis缓存
use houseorm\Cache\Config\CacheConfig; use houseorm\config\Config; use houseorm\EntityManager; $config = new Config($configParams); // driver - CacheConfig::REDIS_DRIVER // cache lifetime - 10 // Redis host - 127.0.0.1 $config->setCacheConfig(new CacheConfig(CacheConfig::REDIS_DRIVER, 10, '127.0.0.1')); $entityManager = new EntityManager($config);