は2年間CI開発を行っており、データベースの操作にはactiveRecordを使用しています。シンプルで軽くて便利です。最近のプロジェクトは私の部下に引き継がれ、データベース設計から始まる開発プロセスが採用され、現在はオンラインで稼働しています。要件の明確化、データベースの設計、CIでのモデルとコントローラーの確立、要件の変更、データベースの変更、コードの変更、要件の追加、データベースの変更などのプロセスを経てきました。振り返ってみると、グローバル コードとビジネス ロジックの要件を理解する必要があるとき、依然としてデータベースから始めなければならないことに、突然退屈を感じます。オブジェクトの属性はすべてデータベース内にあり、関連する操作はコード内にあります。 、非常に断片的に感じられます。何年も前に C# と JAVA で開発された便利な ORM フレームワークがいくつかあったことを思い出します。私にとって ORM の最大の利点は、プロジェクトの初期段階で、ニーズに応じてオブジェクトを設計できることです。変更、削除、クエリは進行中であり、データベースへのオブジェクトの追加、変更、削除、クエリも直接使用されます。オブジェクト指向。
考えられる 2 つの懸念:
(公式参考ドキュメント: http://doctrine-orm.readthedocs.org/en/latest/tutorials/getting-started.html)
始めましょう、私たちの目標は何ですか、虫歯がないことです!まあ、これは私たちの目的の 1 つにすぎません。他にも目的があります:
a. 最新の CI 3.0 はすでに Composer をサポートしています。 以下のようにアプリケーションフォルダーにcomposer.sonファイルを作成します。 (CI ルート ディレクトリにはありません)。 autoload パラメーターに注意してください (公式例の /src/ フォルダーではありません)
リーリー
注: doctrine の起動にはエンティティ ディレクトリを指定する必要があるため、上記の autoload パラメータは非常に重要です。ここでは、これを CI の model/entities ディレクトリに追加します。 /proxies ディレクトリは同時に作成され、生成されたディレクトリはデータベースからエンティティを生成するために使用され、proxies ディレクトリは遅延読み込みが生成する必要があるコードを保存するために使用されます。b. doctrine をインストールします: インストール後のディレクトリ構造は次のとおりです:
2. ブートストラップと cli-config を設定する
ブートストラップでは、最初にcomposer独自の関数を使用して教義全体をロードします。 (CI 変更へのドクトリンの導入を最小限に抑えるために、コンポーザー機能はここに保持されています)
基本的なentityManagerの作成には、次の2つのステップのみが必要です:
設定を作成するにはセットアップを使用します。
71c555f28b58bf2a21055b54c25714fa 'pdo_mysql',
'user' => $db['default']['username'],
'password' => $db['default']['password'],
'host' => $db['default']['hostname'],
'dbname' => $db['default']['database']
);
}
else
{
$conn = array(
'driver' => 'pdo_mysql',
'user' => 'root',
'password' => '',
'host' => '127.0.0.1',
'dbname' => 'doctrine'
);
}
//Below can be exected in cli
/*
require_once APPPATH.'vendor/Doctrine/Common/lib/doctrine/common/ClassLoader.php';
$doctrineClassLoader = new ClassLoader('Doctrine', APPPATH.'libraries');
$doctrineClassLoader->register();
$entitiesClassLoader = new ClassLoader('models', rtrim(APPPATH, "/" ));
$entitiesClassLoader->register();
$proxiesClassLoader = new ClassLoader('Proxies', APPPATH.'models/proxies');
$proxiesClassLoader->register();
*/
// Create a simple "default" Doctrine ORM configuration for Annotations
$isDevMode = true;
$config = Setup::createAnnotationMetadataConfiguration(array(__DIR__."/models/entities"), $isDevMode);
// or if you prefer yaml or XML
//$config = Setup::createXMLMetadataConfiguration(array(__DIR__."/config/xml"), $isDevMode);
//$config = Setup::createYAMLMetadataConfiguration(array(__DIR__."/config/yaml"), $isDevMode);
$cache = new ArrayCache;
$config->setMetadataCacheImpl($cache);
$driverImpl = $config->newDefaultAnnotationDriver(array(__DIR__.'/models/entities'));
$config->setMetadataDriverImpl($driverImpl);
$config->setQueryCacheImpl($cache);
$config->setQueryCacheImpl($cache);
// Proxy configuration
$config->setProxyDir(__DIR__.'/models/proxies');
$config->setProxyNamespace('Proxies');
// Set up logger
//$logger = new EchoSQLLogger;
//$config->setSQLLogger($logger);
$config->setAutoGenerateProxyClasses( TRUE );
// obtaining the entity manager
global $entityManager;
$entityManager = EntityManager::create($conn, $config);
View Code
要让entityManager知道用哪里的对象来进行反向工程,下面这句就尤为重要了: $config = SetupcreateAnnotationMetadataConfiguration(array(DIR."/models/entities"), $isDevMode); (在这里也提一下,当从数据库生成entity时当然也要指明entity要放在哪个文件夹了,使用的是EntityGenerator对象,使用该对象的generate方法时指定存放的文件夹就可以了。) 官方文档中使用的是命令行的方法来进行反向工程的,我们这里也依样画葫芦,接下来创建必要的cli-config文件。这个文件相对来讲就没有bootstrap那么长了,总公只有下面两行即可: 反向工程使用vendor/bin/中的doctrine命令: 其中常用的有如下: notes: 使用update命令新增字段不会影响原先的数据。 好吧,是不是急不可奈要试一试了,输入第一条create命令,咦,不好出现一个错误 “No Metadata Classes to process.” ,心跳加快,冷静,这是正常的,是因为我们还没建立我们想要的entity呢。 1. 在/models/entities中建立我们第一个entity: Product.php 注意这里的每一个属性都protected属性,对应都有一对mutator(getter与setter)这是有什么用处的呢?由官方文档所说是用来方便doctrine来产生entity,而不是使用entity.field=foo的方式。具体在doctrine如何操作的有待进一步探索。对于主键Id是没有setter方法的,你懂的。 2. 现在我们只是定义了对象,但数据库构造是需要一些数据库属性的,类名与属性前面的metadata就是来干这个的。(定义的表名,对象属性对应的数据库字段名与字段属性) 3. 下面我们就可以使用下面命令来进行反向工程了,是不是很兴奋! 4. 下面我们就来建立一段脚本来生成一个product并将其插入数据(持久化),你就会发现如何面向对象,隐藏数据库操作的了。 5. 下面我们就要使用cli来运行这段php脚本调用ORM框架来插入product了。 查看数据库,是不是发现了新的数据已经插入了,ok大功告成。requireonce "bootstrap.php"<span>;
</span><span>return</span> DoctrineORMToolsConsoleConsoleRunnercreateHelperSet(<span>$entityManager</span>);
vendor/bin/doctrine
vendor/bin/doctrine orm:schema-<span>tool:create
vendor</span>/bin/doctrine orm:schema-tool:update --force
建立entity进行反向工程
<?<span>php
</span><span>//</span><span> src/Product.php</span><span>
/*</span><span>*
* @Entity @Table(name="products")
*</span><span>*/</span>
<span>class</span><span> Product
{
</span><span>/*</span><span>* @Id @Column(type="integer") @GeneratedValue *</span><span>*/</span>
<span>protected</span> <span>$id</span><span>;
</span><span>/*</span><span>* @Column(type="string") *</span><span>*/</span>
<span>protected</span> <span>$name</span><span>;
</span><span>public</span> <span>function</span><span> getId()
{
</span><span>return</span> <span>$this</span>-><span>id;
}
</span><span>public</span> <span>function</span><span> getName()
{
</span><span>return</span> <span>$this</span>-><span>name;
}
</span><span>public</span> <span>function</span> setName(<span>$name</span><span>)
{
</span><span>$this</span>->name = <span>$name</span><span>;
}
}</span>
vendor/bin/doctrine orm:schema-tool:update --force --dump-sql
<?<span>php
</span><span>require_once</span> "bootstrap.php"<span>;
</span><span>$newProductName</span> = <span>$argv</span>[1<span>];
</span><span>$product</span> = <span>new</span><span> Product();
</span><span>$product</span>->setName(<span>$newProductName</span><span>);
</span><span>$entityManager</span>->persist(<span>$product</span><span>);
</span><span>$entityManager</span>-><span>flush</span><span>();
</span><span>echo</span> "Created Product with ID " . <span>$product</span>->getId() . "\n";
$<span> php createproduct.php ORM
</span>$ php createproduct.php DBAL