tarasmatskovich/house-orm

1.1.8 2020-07-21 09:32 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);