在 CakePHP 中,通过数据库操作数据主要使用两种对象类型。
资源库或表对象提供对数据集合的访问。它们允许您保存新记录、修改/删除现有记录、定义关系以及执行批量操作。
实体代表单个记录,允许您定义行/记录级别的行为和功能。
这两类通常负责管理与您的数据相关的大部分操作,包括数据的有效性、交互和工作域中信息工作流程的演变。
CakePHP 的内置 ORM 专注于关系型数据库,但可以扩展以支持其他数据源。
CakePHP ORM 借鉴了 ActiveRecord 和 Datamapper 模式中的想法和概念。它旨在创建一种混合实现,将两种模式的各个方面结合起来,以创建一个快速且易于使用的 ORM。
在开始探索 ORM 之前,请确保您已配置您的数据库连接.
要开始,您无需编写任何代码。如果您已遵循CakePHP 数据库表的约定,您可以直接开始使用 ORM。例如,如果我们想从 articles
表中加载一些数据,我们将从创建我们的 Articles
表类开始。使用以下代码创建 src/Model/Table/ArticlesTable.php
<?php
namespace App\Model\Table;
use Cake\ORM\Table;
class ArticlesTable extends Table
{
}
然后,在控制器或命令中,我们可以让 CakePHP 为我们创建一个实例
public function someMethod()
{
$resultset = $this->fetchTable('Articles')->find()->all();
foreach ($resultset as $row) {
echo $row->title;
}
}
在其他情况下,您可以使用 LocatorAwareTrait
,它会为 ORM 表添加访问器方法
use Cake\ORM\Locator\LocatorAwareTrait;
public function someMethod()
{
$articles = $this->fetchTable('Articles');
// more code.
}
在静态方法中,您可以使用 Cake\Datasource\FactoryLocator
获取表定位器
$articles = TableRegistry::getTableLocator()->get('Articles');
表类代表实体的集合。接下来,让我们为我们的 Articles 创建一个实体类。实体类允许您定义访问器和修改器方法,为单个记录定义自定义逻辑等等。我们将从在 <?php
开头标签之后将以下内容添加到 src/Model/Entity/Article.php
namespace App\Model\Entity;
use Cake\ORM\Entity;
class Article extends Entity
{
}
默认情况下,实体使用表名的单数驼峰式版本作为其类名。现在我们已经创建了实体类,当我们从数据库加载实体时,我们将获得我们新 Article 类的实例
use Cake\ORM\Locator\LocatorAwareTrait;
$articles = $this->fetchTable('Articles');
$resultset = $articles->find()->all();
foreach ($resultset as $row) {
// Each row is now an instance of our Article class.
echo $row->title;
}
CakePHP 使用命名约定将表和实体类联系起来。如果您需要自定义表使用的实体,可以使用 entityClass()
方法来设置特定的类名。