4k1r0/ormega

该软件包最新版本(1.1.0)没有提供许可信息。

易于使用的ORM

1.1.0 2016-09-15 14:36 UTC

This package is not auto-updated.

Last update: 2024-09-14 18:20:45 UTC


README

基于MySQL的简单ORM,可直接从数据库生成类

! 适用于非CodeIgniter项目 !

此ORM使用Codeigniter Querybuilder,因此集成了独立的CI Querybuilder。

有关Codeigniter项目的更多信息,请参阅 此处

使用composer安装

composer require 4k1r0/ormega

模型生成

如何操作

<?php

// Composer autoloader
require 'vendor/autoload.php';

use Evolution\CodeIgniterDB as CI;

// Codeigniter style database configuration
$db_data_1 = array(
    'dsn'   => '',
    'hostname' => 'localhost',
    'username' => 'root',
    'password' => '',
    'database' => 'database1',
    'dbdriver' => 'mysqli',
    'dbprefix' => '',
    'pconnect' => FALSE,
    'db_debug' => TRUE,
    'cache_on' => FALSE,
    'cachedir' => '',
    'char_set' => 'utf8',
    'dbcollat' => 'utf8_general_ci',
    'swap_pre' => '',
    'encrypt' => FALSE,
    'compress' => FALSE,
    'stricton' => FALSE,
    'failover' => array(),
    'save_queries' => TRUE
);

$db_data_2 = array(
    'dsn'   => '',
    'hostname' => 'localhost',
    'username' => 'root',
    'password' => '',
    'database' => 'database2',
    'dbdriver' => 'mysqli',
    'dbprefix' => '',
    'pconnect' => FALSE,
    'db_debug' => TRUE,
    'cache_on' => FALSE,
    'cachedir' => '',
    'char_set' => 'utf8',
    'dbcollat' => 'utf8_general_ci',
    'swap_pre' => '',
    'encrypt' => FALSE,
    'compress' => FALSE,
    'stricton' => FALSE,
    'failover' => array(),
    'save_queries' => TRUE
);

// Creates CI database connectors 
$db1 =& CI\DB($db_data_1);
$db2 =& CI\DB($db_data_2);

// Generator config
$config = array(
    'databases' => array(
        'database1' => array(
            'db' => $db1,
            'filter' => '^(user|profil|application)$',
        ),
        'database2' => array(
            'db' => $db2,
            'filter' => 'business_.*',
        ),
    ),
    'path'      => 'models/',
    'namespace' => 'Ormega'
);

try {
    // Go !
    $Ormegagen = new \Ormega\Generator($config);
    $Ormegagen->run();
}
catch (\InvalidArgumentException $e){
    // ...
}

生成的类

这将创建一个 {namespace} 目录在 ./{path}

如果我从 /var/www/myproject/ 运行生成器

$config['path'] = 'models/';
$config['namespace'] = 'Ormega';

将导致

/var/www/myproject/models/Ormega/Database1/Entity
/var/www/myproject/models/Ormega/Database1/Enum
/var/www/myproject/models/Ormega/Database1/Query

/var/www/myproject/models/Ormega/Database2/Entity
/var/www/myproject/models/Ormega/Database2/Enum
/var/www/myproject/models/Ormega/Database2/Query

'Enum' 的解释如下。

'Entity' 和 'Query' 目录包含一个空的PHP类,用于每个由生成器解析的表,还有一个 'base' 目录。

这些类继承自 'base' 目录内的类。它们是空的,以允许自定义方法覆盖。

如果你重新启动生成,它们不会被删除。

“真正的”类位于 'base' 目录中。

它们必须不手动修改,因为每次生成都会写入新文件。

自定义方法

在这些“空的”类中,你可以自由地重新定义每个方法。

你可以在setter、getter或甚至save方法中添加任何你想要的内容。

或者创建自定义查询(覆盖 find())或过滤器。

枚举

枚举是从名为 'enum[...]' 的表中创建的特殊模型,设计用于包含常量。

这些表必须只有3列:'id'、'label'、'constant'

如果你想添加一个常量,你将不得不重新启动生成。

示例

enumgender

可以这样使用

 if( $oUser->getGenderId() == \Ormega\Database\Enum\Enumgender::MAN ){
    // Do stuff if man
 }

这允许比硬编码主ID更易于阅读的代码。

'label'列用作描述。

生成的代码将如下所示

<?php 
        
namespace Ormega\Database\Enum;

class Enumgroup implements \Ormega\EnumInterface {
    
    /** 
     * @var int man gender id
     */
    const MAN = 1;
    
    /** 
     * @var int woman gender id
     */
    const WOMAN = 2;
    
    // ...
}

其中还包括一套方法

    /**
     * Get the "Label" associated to an ID
     * @param int $nId
     * @return string
     */
    public static function getLabel( $nId ){ 
        // ... 
    }
    
    /**
     * Get the "Constant" associated to an ID
     * @param int $nId
     * @return string
     * @author Ormegagenerator_lib
     */
    public static function getConstant( $nId ){ 
        // ... 
    }
    
    **
     * Get all the constants in a array form
     * @return array
     * @author Ormegagenerator_lib
     */
    public static function getArray(){ 
        return array(
            "QUALITE" => array(
                "id" => "1",
                "label" => "man gender id",
                "constant" => "MAN",
            ),
            "MANAGER" => array(
                "id" => "2",
                "label" => "woman gender id",
                "constant" => "WOMAN",
            ),
        );
    }
    
    **
     * Get an ID from a string constant
     * @param string $sConstant
     * @return int
     * @author Ormegagenerator_lib
     */
    public static function getId( $sConstant ){ 
        // ... 
    }

使用方法

初始化

<?php

// Composer autoloader
require 'vendor/autoload.php';

use Evolution\CodeIgniterDB as CI;

// Codeigniter style database configuration
$db_data_1 = array(
    'dsn'   => '',
    'hostname' => 'localhost',
    'username' => 'root',
    'password' => '',
    'database' => 'database1',
    'dbdriver' => 'mysqli',
    'dbprefix' => '',
    'pconnect' => FALSE,
    'db_debug' => TRUE,
    'cache_on' => FALSE,
    'cachedir' => '',
    'char_set' => 'utf8',
    'dbcollat' => 'utf8_general_ci',
    'swap_pre' => '',
    'encrypt' => FALSE,
    'compress' => FALSE,
    'stricton' => FALSE,
    'failover' => array(),
    'save_queries' => TRUE
);

$db_data_2 = array(
    'dsn'   => '',
    'hostname' => 'localhost',
    'username' => 'root',
    'password' => '',
    'database' => 'database2',
    'dbdriver' => 'mysqli',
    'dbprefix' => '',
    'pconnect' => FALSE,
    'db_debug' => TRUE,
    'cache_on' => FALSE,
    'cachedir' => '',
    'char_set' => 'utf8',
    'dbcollat' => 'utf8_general_ci',
    'swap_pre' => '',
    'encrypt' => FALSE,
    'compress' => FALSE,
    'stricton' => FALSE,
    'failover' => array(),
    'save_queries' => TRUE
);

// Creates CI database connectors 
$db1 =& CI\DB($db_data_1);
$db2 =& CI\DB($db_data_2);

try {
    
    // Orm config. Index must be the same as declared in the generator
    $aInit = array(
        'database1' => $db1,
        'database2' => $db2,
    );

    require 'models/Ormega/Orm.php';

    Ormega\Orm::init($aInit);
    
    // ...
}
catch( \InvalidArgumentException $e ){
    // ...
}

这将添加生成模型的自动加载器。

操作、插入或更新

$oCareneeds = new \Ormega\Entity\User();
$oCareneeds->setEmail('test@gmail.com')
           ->setAge(20)
           ->setEmailPublic(true)
           ->save();

为每个表的列都有一个setter和getter。

setter基于列的类型和长度进行自动数据检查。

例如:mysql tinyint(1) 将转换为php布尔值

此检查抛出InvalidArgumentException。

选择多个

$oUserCollection = \Ormega\Query\User::create()
    ->filterByAge(20, \Ormega\Orm::OPERATOR_LOWER_THAN)
    ->filterById($aIds, \Ormega\Orm::OPERATOR_IN)
    ->filterByIsActive(true) // EQUALS as default second argument
    ->orderByDateinsert('DESC')
    ->find();

::create()$oUserQuery = new \Ormega\Query\User(); 的快捷方式

选择一个

$oUserEntity = \Ormega\Query\User::create()
    ->filterById( $nUserId )
    ->findOne();

结果

// Test results
if( $oUserCollection->isEmpty() ){
    // No results   
}

// browse each result
foreach( $oUserCollection as $oUserEntity ){
    /**
     * @var \Ormega\Entity\User $oUserEntity
     */
}

// Get all primary key (ex : to use it within a `WHERE field IN()` sql statement)
$aIds = $oUserCollection->getArrayKeys()

使用方法:外键

生成器检测外键,并在生成的模型中为每个外键添加一个属性。

因此,你可以直接设置引用的Ormega实体模型,而不是外键ID。

FK1 user_id参考User.id

$oUserEntity = new Ormega\Database\Entity\User();
$oProfilEntity = new Ormega\Database\Entity\Profil();

$oProfilEntity->setUser( $oUserEntity );
$oProfilEntity->setFkUserId( $oUserEntity->getId() );  // this 2 lines do the same stuff

// Same way for getters :
$oProfilEntity = new Ormega\Database\Entity\Profil();
$oUserEntity = $oProfilEntity->getUser();

提示:如果你修改User和Profil实体,则只需在Profil实体上执行一次保存。

生成的模型

<?php 
        
namespace Ormega\Database\Entity\Base;

class Profil implements \Ormega\EntityInterface {
     
    /**
     * @var int $fk_user_id Null:NO Maxlenght:10
     */
    protected $fk_user_id;
    
    /**
     * @var Ormega\Database\Entity\User $user Null:NO
     */
    protected $user;
    
    // ...
    
    /**
     * @param int $fk_user_id Maxlenght:11
     * @throw \InvalidArgumentException
     */
    public function setFkUserId( $fk_user_id )
    {
        if( !is_int( $fk_user_id ) ) {
            throw new \InvalidArgumentException("Invalid parameter for \"".__METHOD__."\" : (int) expected ; \"$fk_user_id\" (".gettype($fk_user_id).") provided");
         }
            
        $this->fk_user_id = $fk_user_id;
        $this->modified(true);
        
        return $this;
    }
    
    /**
     * @param \Ormega\Database\Entity\User $user
     */
    public function setComment(\Ormega\Database\Entity\User $user)
    {
        $this->user = $user;
        $this->fk_user_id = $user->getId();
        $this->modified(true);
        
        return $this;
    }
}