cakephp/orm

CakePHP ORM - 提供一个灵活且强大的ORM实现数据映射模式。

5.1.0 2024-09-10 19:29 UTC

This package is auto-updated.

Last update: 2024-09-21 03:08:22 UTC


README

Total Downloads License

CakePHP ORM

CakePHP ORM 提供了一种强大且灵活的方式来处理关系型数据库。使用数据映射模式,ORM 允许您将数据作为实体进行操作,从而让您可以在应用程序中创建具有表现力的领域层。

支持的数据库引擎

CakePHP ORM 兼容

  • MySQL 5.1+
  • Postgres 8+
  • SQLite3
  • SQLServer 2008+
  • Oracle(通过一个 社区插件

连接到数据库

使用此库时,您需要做的第一件事是注册一个连接对象。在执行任何与连接相关的操作之前,您需要指定要使用的驱动程序

use Cake\Datasource\ConnectionManager;

ConnectionManager::setConfig('default', [
	'className' => \Cake\Database\Connection::class,
	'driver' => \Cake\Database\Driver\Mysql::class,
	'database' => 'test',
	'username' => 'root',
	'password' => 'secret',
	'cacheMetadata' => true,
	'quoteIdentifiers' => false,
]);

一旦注册了 '默认' 连接,如果没有显式定义连接,它将被所有表映射器使用。

使用表定位器

为了访问表实例,您需要使用一个 表定位器

use Cake\ORM\Locator\TableLocator;

$locator = new TableLocator();
$articles = $locator->get('Articles');

您还可以使用特性以方便地访问定位器实例

use Cake\ORM\Locator\LocatorAwareTrait;

$articles = $this->getTableLocator()->get('Articles');

默认情况下,使用 LocatorAwareTrait 的类将共享一个全局定位器实例。您可以将自己的定位器实例注入到对象中

use Cake\ORM\Locator\TableLocator;
use Cake\ORM\Locator\LocatorAwareTrait;

$locator = new TableLocator();
$this->setTableLocator($locator);

$articles = $this->getTableLocator()->get('Articles');

创建关联

在您的表类中,您可以定义表之间的关系。CakePHP的ORM默认支持4种关联类型

  • belongsTo - 例如,许多文章属于一个用户。
  • hasOne - 例如,一个用户有一个资料。
  • hasMany - 例如,一个用户有许多文章。
  • belongsToMany - 例如,一篇文章属于多个标签。

您在表的 initialize() 方法中定义关联。有关完整示例,请参阅文档

读取数据

一旦定义了一些表类,您就可以读取表中现有的数据

use Cake\ORM\Locator\LocatorAwareTrait;

$articles = $this->getTableLocator()->get('Articles');
foreach ($articles->find() as $article) {
	echo $article->title;
}

您可以使用 查询构建器 创建复杂查询,以及各种方法来访问您的数据。

保存数据

表对象提供将请求数据转换为实体,然后将这些实体持久化到数据库的方法

use Cake\ORM\Locator\LocatorAwareTrait;

$data = [
	'title' => 'My first article',
	'body' => 'It is a great article',
	'user_id' => 1,
	'tags' => [
		'_ids' => [1, 2, 3]
	],
	'comments' => [
		['comment' => 'Good job'],
		['comment' => 'Awesome work'],
	]
];

$articles = $this->getTableLocator()->get('Articles');
$article = $articles->newEntity($data, [
	'associated' => ['Tags', 'Comments']
]);
$articles->save($article, [
	'associated' => ['Tags', 'Comments']
])

以上展示了您如何以简单而强大的方式轻松地序列化和保存实体及其关联。有关更深入的示例,请参阅ORM 文档

删除数据

一旦您有一个实体的引用,您可以使用它来删除数据

$articles = $this->getTableLocator()->get('Articles');
$article = $articles->get(2);
$articles->delete($article);

元数据缓存

建议为生产系统启用元数据缓存以避免性能问题。例如,对于文件系统策略,您的引导文件可能看起来像这样

use Cake\Cache\Engine\FileEngine;

$cacheConfig = [
   'className' => FileEngine::class,
   'duration' => '+1 year',
   'serialize' => true,
   'prefix'    => 'orm_',
];
Cache::setConfig('_cake_model_', $cacheConfig);

缓存配置是可选的,因此您必须引入 cachephp/cache 来添加一个。

创建自定义表和实体类

默认情况下,Cake ORM 使用 \Cake\ORM\Table\Cake\ORM\Entity 类与数据库交互。虽然使用默认类对于快速脚本和小型应用程序来说是合理的,但您通常会想使用自己的类来添加自定义逻辑。

当将 ORM 作为独立包使用时,您可以自由选择存储这些类的地方。例如,您可以使用 Data 文件夹来存储这些类

<?php
// in src/Data/Table/ArticlesTable.php
namespace Acme\Data\Table;

use Acme\Data\Entity\Article;
use Acme\Data\Table\UsersTable;
use Cake\ORM\Table;

class ArticlesTable extends Table
{
    public function initialize()
    {
        $this->setEntityClass(Article::class);
        $this->belongsTo('Users', ['className' => UsersTable::class]);
    }
}

此表类现在已配置为连接到您数据库中的 articles 表,并在获取结果时返回 Article 实例。要获取此类的实例,如之前所示,您可以使用 TableLocator

<?php
use Acme\Data\Table\ArticlesTable;
use Cake\ORM\Locator\TableLocator;

$locator = new TableLocator();
$articles = $locator->get('Articles', ['className' => ArticlesTable::class]);

使用基于约定的加载

每次都必须指定要加载的类名可能会变得相当繁琐。因此,如果您提供一些配置,Cake ORM 可以为您完成大部分工作。

约定是将所有 ORM 相关类放在 src/Model 文件夹中,即您的应用程序的 Model 子命名空间。因此,您的项目中通常会有 src/Model/Tablesrc/Model/Entity 文件夹。但首先,我们需要通知 Cake 您的应用程序所在的空间名称。

<?php
use Cake\Core\Configure;

Configure::write('App.namespace', 'Acme');

您还可以设置一个较长的命名空间,直到 Model 文件夹的位置。

<?php
use Cake\Core\Configure;

Configure::write('App.namespace', 'My\Log\SubNamespace');

附加文档

有关更深入的文档,请参阅 CakePHP ORM 文档