emma/orm

PHP 8.2+ 基于属性的 ORM,用于对象/实体/DTO。主要受到 Java SpringBoot 注解式 ORM 的启发。

v1.0.8 2024-01-15 16:22 UTC

This package is auto-updated.

Last update: 2024-09-18 01:58:40 UTC


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 中。享受吧!

还有许多其他高级功能,支持所有类型的映射关系,以及对匿名函数的更多支持。官方文档网站将在下个月推出。