4k1r0 / ormega
易于使用的ORM
Requires
- php: >=5.3.0
- 4k1r0/codeigniterdb: 1.0.0
- composer/installers: 1.0.*
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; } }