emma / orm
PHP 8.2+ 基于属性的 ORM,用于对象/实体/DTO。主要受到 Java SpringBoot 注解式 ORM 的启发。
v1.0.8
2024-01-15 16:22 UTC
Requires
- php: >=8.2
- emma/common: ^1.1.4
- emma/dbal: ^1.0.0
- emma/di: ^1.2.3
- emma/validation: ^1.0.1
Requires (Dev)
- emma/common: ^1.1.3
- emma/dbal: ^1.0.0
- emma/di: ^1.2.3
- emma/validation: ^1.0.1
README
PHP 8.2+ 基于属性的 ORM,用于对象/实体/DTO。主要受到 Java SpringBoot 注解式 ORM 的启发。
PHP 引入了它自己的内置注解,称为 PHP 属性。在几个项目中使用过 Java SpringBoot 后,发现可以在 PHP 中实现一个类似的 ORM,以便轻松进行对象注入和验证,同时还可以轻松实现复杂的映射关系。
嘿,好消息是,如果你曾经是一名 Java SpringBoot 开发者,现在想转向 PHP,这是最适合你的 ORM。我很快将推出官方文档网站。现在,这里有一个快速入门指南
Dbal 连接
Emma\ORM\Connection\Connection::getInstance()->connect([]);
//This accept the Dbal ConnectionProperty or array of connection details.
更多信息请参阅:https://github.com/debascoguy/Dbal
快速示例应用程序:到主要内容
实体:AppUser
<?php
use Emma\ORM\Attributes\Entity\Entity;
use Emma\ORM\Attributes\Entity\Identifier\PrimaryKey;
use Emma\ORM\Attributes\Entity\Property\Column;
use Emma\ORM\Attributes\Relationships\JoinColumn;
use Emma\ORM\Attributes\Relationships\JoinColumnValue;
use Emma\ORM\Attributes\Relationships\JoinTable;
use Emma\ORM\Attributes\Relationships\OneToMany;
use Emma\ORM\Attributes\Relationships\OneToOne;
use Emma\Validation\Converter\DateTimeFormat;
#[Entity("app_user")]
class AppUser
{
/**
* @var int|null
*/
#[PrimaryKey]
#[Column('id')]
protected ?int $id = null;
/**
* @var string|null
*/
#[Column('email')]
protected ?string $email = null;
/**
* @var string|null
*/
#[Column('first_name')]
protected ?string $first_name = null;
/**
* @var string|null
*/
#[Column('last_name')]
protected ?string $last_name = null;
/**
* @var string|null
*/
#[Column('country')]
protected ?string $country = null;
/**
* @var string|null
*/
#[Column('zipcode')]
protected ?string $zipcode = null;
/**
* @var string|null
*/
#[Column('state')]
protected ?string $state = null;
/**
* @var string|null
*/
#[Column('city')]
protected ?string $city = null;
/**
* @var string|null
*/
#[Column('address')]
protected ?string $address = null;
/**
* @var int|null
*/
#[Column('img')]
protected ?int $img = null;
/**
* @var string|null
*/
#[Column('password')]
protected ?string $password = null;
/**
* @var \DateTime|null
*/
#[DateTimeFormat]
#[Column('time_created')]
protected ?\DateTime $time_created = null;
/**
* @var boolean
*/
#[Column('account_expired')]
protected bool $account_expired = false;
/**
* @var boolean
*/
#[Column('account_locked')]
protected bool $account_locked = false;
/**
* @var boolean
*/
#[Column('credentials_expired')]
protected bool $credentials_expired = false;
/**
* @var boolean
*/
#[Column('is_deleted')]
protected bool $is_deleted = false;
/**
* @var AppDocument|null
*/
#[OneToOne(AppDocument::class)]
#[JoinTable(
'app_user_document',
[new JoinColumn('user_id', 'id')],
[
new JoinColumn('document_id', 'id'),
new JoinColumnValue('doc_type', DocType::PROFILE_IMAGE)
],
)]
protected ?AppDocument $profileImage = null;
#[OneToOne(ClientAppUser::class)]
#[JoinColumn('app_user_id', 'id')]
protected ClientAppUser $masterClient = null;
#[OneToMany(ClientAppUser::class)]
#[JoinColumn('app_user_id', 'id')]
protected array $clients = [];
#[OneToMany(AppRole::class)]
#[JoinTable(
'app_users_roles',
[new JoinColumn('user_id', 'id')],
[new JoinColumn('role_id', 'id')],
)]
protected array $roles = [];
/**
* AppUser constructor
*/
public function __construct()
{
$this->setTimeCreated(new \DateTime("now"));
}
//... you can create the setter/getter if you want to. it's optional.
}
注意 DateTime 的验证转换器。这里有一个完整的验证包
https://github.com/debascoguy/validation
你可以使用基于属性的验证包轻松验证任何属性,这个包已经作为必需依赖项包含在这个 ORM 包中。
仓库
<?php
namespace Emma\Modules\Api\Model\Repository;
use Emma\Dbal\QueryBuilder\Constants\FetchMode;
use Emma\Dbal\QueryBuilder\Constants\QueryType;
use Emma\Dbal\QueryBuilder\Expressions\WhereCompositeCondition;
use Emma\Dbal\QueryBuilder\Expressions\WhereCondition;
use Emma\Dbal\QueryBuilder\Services\CriteriaHandler;
use Emma\Modules\Api\Model\Entity\AppUser;
use Emma\ORM\Attributes\Repository\Repository;
use Emma\ORM\Repository\CrudRepository;
/**
* Example of Anonymouse Functions Available
* ======================================
* @method AppUser[] findByEmail($email);
* @method AppUser findOneByEmail($email);
* @method AppUser findOneByEmailAndPassword($email, $password);
* @method int existsByEmail($email)
*/
#[Repository(AppUser::class)]
class AppUserRepository extends CrudRepository
{
/**
* AppUserRepository constructor
*/
public function __construct()
{
parent::__construct(AppUser::class);
}
/**
... Create personal use-case functions as needed aside form the provided CRUD functions and Supported Annonymous functions available.
*/
}
这就是它的主要内容。开始按照自己的意愿使用你的仓库。建议使用 https://github.com/debascoguy/Di
来自动将仓库注入到你的服务、控制器或中间件服务/容器中。Di 已经作为依赖项安装在此 ORM 中。享受吧!
还有许多其他高级功能,支持所有类型的映射关系,以及对匿名函数的更多支持。官方文档网站将在下个月推出。