类表
表示单个数据库表。
提供从表中检索数据的函数,并管理此表与其他表的关联。可以为同一个数据库表创建多个此类的实例,但使用不同的别名。这允许您以更丰富和更具表现力的方式访问您的数据库结构。
检索数据
检索数据的首要方法是使用 Table::find()。有关更多信息,请参见该方法。
动态查找器
除了标准的 find($type) 查找器方法之外,CakePHP 还提供了动态查找器方法。这些方法允许您轻松地设置基本条件。例如,要按用户名过滤用户,您将调用
$query = $users->findByUsername('mark');
您还可以使用 Or
或 And
在多个字段上组合条件
$query = $users->findByUsernameOrEmail('mark', '[email protected]');
批量更新/删除
您可以使用 Table::updateAll() 和 Table::deleteAll() 来执行批量更新/删除操作。您应该注意,批量更新/删除不会触发事件。
事件
Table 对象在 find、delete 和 save 操作期间作为生命周期钩子发出多个事件。所有事件都使用 CakePHP 事件包
-
Model.beforeFind
在每次 find 操作之前触发。通过停止事件并提供返回值,您可以完全绕过 find 操作。对 $query 实例所做的任何更改都将保留在整个 find 操作中。$primary
参数指示这是根查询还是关联查询。 -
Model.buildValidator
允许监听器修改提供的命名验证器验证规则。 -
Model.buildRules
允许监听器通过添加更多规则来修改规则检查器。 -
Model.beforeRules
在实体使用规则检查器进行验证之前触发。通过停止此事件,您可以返回规则检查操作的最终值。 -
Model.afterRules
在实体上检查完规则后触发。通过停止此事件,您可以返回规则检查操作的最终值。 -
Model.beforeSave
在每次保存实体之前触发。停止此事件将中止保存操作。当事件被停止时,将返回事件的结果。 -
Model.afterSave
在实体被保存后触发。 -
Model.afterSaveCommit
在包含 save 操作的事务提交后触发。它也触发非原子保存,其中数据库操作是隐式提交的。该事件仅针对直接调用 save() 的主表触发。如果在调用 save 之前启动事务,则不会触发该事件。 -
Model.beforeDelete
在实体被删除之前触发。通过停止此事件,您将中止删除操作。 -
Model.afterDelete
在实体被删除后触发。
回调
您可以通过实现以下生命周期方法,在您的表类中订阅上述事件
beforeFind(EventInterface $event, SelectQuery $query, ArrayObject $options, boolean $primary)
beforeMarshal(EventInterface $event, ArrayObject $data, ArrayObject $options)
afterMarshal(EventInterface $event, EntityInterface $entity, ArrayObject $options)
buildValidator(EventInterface $event, Validator $validator, string $name)
buildRules(RulesChecker $rules)
beforeRules(EventInterface $event, EntityInterface $entity, ArrayObject $options, string $operation)
afterRules(EventInterface $event, EntityInterface $entity, ArrayObject $options, bool $result, string $operation)
beforeSave(EventInterface $event, EntityInterface $entity, ArrayObject $options)
afterSave(EventInterface $event, EntityInterface $entity, ArrayObject $options)
afterSaveCommit(EventInterface $event, EntityInterface $entity, ArrayObject $options)
beforeDelete(EventInterface $event, EntityInterface $entity, ArrayObject $options)
afterDelete(EventInterface $event, EntityInterface $entity, ArrayObject $options)
afterDeleteCommit(EventInterface $event, EntityInterface $entity, ArrayObject $options)
参见: \Cake\Event\EventManager 了解事件系统的参考。
链接: https://book.cakephp.com.cn/5/en/orm/table-objects.html#event-list
常量
-
string
BUILD_VALIDATOR_EVENT ¶'Model.buildValidator'
在构建验证器时分派的事件名称。
-
string
DEFAULT_VALIDATOR ¶'default'
默认验证集的名称。
-
class-stringCake\ORM\Rule\IsUnique>
IS_UNIQUE_CLASS ¶IsUnique::class
使用的 IsUnique 类名称。
-
class-stringCake\ORM\RulesChecker>
RULES_CLASS ¶RulesChecker::class
使用的规则类名称。
-
string
VALIDATOR_PROVIDER_NAME ¶'table'
此对象在验证器中分配的别名。
属性摘要
-
$_alias protected
string|null
给此特定实例赋予的名称。通过使用不同的别名,可以存在代表同一个数据库表的多个对象。
-
$_associations protected
Cake\ORM\AssociationCollection
此表的关联容器。
-
$_behaviors protected
Cake\ORM\BehaviorRegistry
此表的 BehaviorRegistry
-
$_connection protected
Cake\Database\Connection|null
连接实例
-
$_displayField protected
list<string>|string|null
表示行的人类可读表示形式的字段的名称
-
$_entityClass protected
string|null
代表此表单行的类的名称
-
$_eventClass protected
string
新事件对象的默认类名称。
-
$_eventManager protected
Cake\Event\EventManagerInterface|null
此对象用于分发内部事件的 Cake\Event\EventManager 实例。
-
$_primaryKey protected
list<string>|string|null
代表表中主键的字段的名称
-
$_registryAlias protected
string|null
用于创建此表对象的注册表键
-
$_rulesChecker protected
Cake\Datasource\RulesChecker|null
要应用于此表保存的实体的域规则
-
$_schema protected
Cake\Database\Schema\TableSchemaInterface|null
包含此表字段描述的架构对象
-
$_table protected
string|null
表在数据库中找到的名称
-
$_validatorClass protected
string
验证器类。
-
$_validators protected
arrayCake\Validation\Validator>
按名称索引的验证对象列表
-
$queryFactory protected
QueryFactory
方法摘要
-
__call() public
处理行为委托和动态查找器。
-
__construct() public
初始化一个新的实例
-
__debugInfo() public
返回一个数组,该数组可用于描述此对象的内部状态。
-
__get() public
如果存在,则返回以传递的值命名的关联,否则抛出异常。
-
__isset() public
返回此表是否存在以传递的值命名的关联。
-
_deleteMany() protected
-
_dynamicFinder() protected
提供动态 findBy 和 findAllBy 方法。
-
_executeTransaction() protected
处理在事务中执行工作程序的逻辑。
-
_getFindOrCreateQuery() protected
获取 findOrCreate() 的查询对象。
-
_insert() protected
辅助函数,用于处理在表中插入实体的数据
-
_newId() protected
为新记录生成主键值。
-
_onSaveSuccess() protected
在为该表成功保存实体后,处理子关联的保存并执行 afterSave 逻辑。
-
_processDelete() protected
执行删除操作。
-
_processFindOrCreate() protected
根据传递的选项,执行实体的实际查找和/或创建操作。
-
_processSave() protected
根据传递的选项执行实体的实际保存操作。
-
_saveMany() protected
-
_setFieldMatchers() protected
从选项数组中,检查
$keys
中描述的键是否为数组,并将这些键的值更改为闭包,这些闭包将在传递行时连接值数组中的每个属性。 -
_transactionCommitted() protected
检查调用者是否已对事务执行了提交操作。
-
_update() protected
辅助函数,用于处理在表中更新实体数据的操作。
-
addAssociations() public
设置多个关联。
-
addBehavior() public
添加一个行为。
-
addBehaviors() public
将一组行为添加到表的行为集合中。
-
aliasField() public
使用表的当前别名别名一个字段。
-
associations() public
获取此表的关联集合。
-
behaviors() public
返回此表的行为注册表。
-
belongsTo() public
在当前表和目标表之间创建新的“属于”关联。 “属于”关联是 N-1 关系,其中当前表是 N 端,并且在当前表中的每条记录在目标表中都有一个关联记录。
-
belongsToMany() public
在当前表和目标表之间创建新的“属于多个”关联。 “属于多个”关联是 M-N 关系。
-
buildRules() public
在修改提供的 RulesChecker 对象后,返回该对象。
-
callFinder() public
调用查找器方法并将其应用于传递的查询。
-
checkAliasLengths() protected
检查用于查询的所有表名 + 列名组合是否符合数据库驱动程序允许的最大长度。
-
checkRules() public
返回传递的实体是否符合存储在规则检查器中的所有规则。
-
createValidator() protected
使用类中的自定义方法创建验证器。
-
defaultConnectionName() public static
获取默认连接名称。
-
delete() public
删除单个实体。
-
deleteAll() public
删除与提供的条件匹配的所有记录。
-
deleteMany() public
删除表中的多个实体。
-
deleteManyOrFail() public
删除表中的多个实体。
-
deleteOrFail() public
尝试删除实体,如果实体是新的,没有主键值,应用程序规则检查失败或删除被回调中止,则抛出 PersistenceFailedException。
-
deleteQuery() public
创建一个新的删除查询。
-
dispatchEvent() public
用于创建和分发事件的包装器。
-
exists() public
如果此存储库中存在任何与指定条件匹配的记录,则返回 true。
-
find() public
为当前存储库创建一个新的查询,并根据所选搜索类型应用一些默认值。
-
findAll() public
按原样返回查询。
-
findAssociation() protected
返回为指定别名(如果有)配置的关联对象。
-
findList() public
设置查询对象,以便结果显示为索引数组,这在任何需要列表的地方(例如填充输入选择框)都很有用。
-
findOrCreate() public
查找现有记录或创建一个新的记录。
-
findThreaded() public
此查找器的结果将是嵌套数组,如果要使用模型数据的 parent_id 字段来构建嵌套结果,则适用。
-
get() public
根据主键查找记录后返回单个记录,如果未找到记录,此方法将抛出异常。
-
getAlias() public
返回表别名。
-
getAssociation() public
返回为指定别名配置的关联对象。
-
getBehavior() public
从注册表中获取行为。
-
getConnection() public
返回连接实例。
-
getDisplayField() public
返回显示字段。
-
getEntityClass() public
返回用于为此表的水化行类。
-
getEventManager() public
返回此对象的 Cake\Event\EventManager 管理器实例。
-
getPrimaryKey() public
返回主键字段名。
-
getRegistryAlias() public
返回用于创建此表实例的表注册表键。
-
getSchema() public
返回描述此表属性的架构表对象。
-
getTable() public
返回数据库表名。
-
getValidator() public
返回标记为 $name 的验证规则。可以使用多个不同命名的验证集,这在需要从系统中的不同例程保存时使用不同规则时很有用。
-
hasAssociation() public
检查此 Table 实例上是否存在特定关联。
-
hasBehavior() public
检查是否已加载具有给定别名的行为。
-
hasField() public
测试表是否具有特定字段/列。
-
hasFinder() public
如果表存在查找器,则返回 true。
-
hasMany() public
在当前表和目标表之间创建新的“具有多个”关联。 “具有多个”关联是 1-N 关系。
-
hasOne() public
在当前表和目标表之间创建新的“具有一个”关联。 “具有一个”关联是 1-1 关系。
-
hasValidator() public
检查是否已设置验证器。
-
implementedEvents() public
获取此表感兴趣的模型回调。
-
initialize() public
初始化表实例。在构造函数之后调用。
-
insertQuery() public
创建一个新的插入查询。
-
invokeFinder() public
-
loadInto() public
通过在数据库中执行额外的查询并将结果合并到相应的属性中,将指定的关联加载到传递的实体或实体列表中。
-
marshaller() public
获取用于将数组数据编组/转换为对象的工具。
-
newEmptyEntity() public
这将创建一个新的实体对象。
-
newEntities() public
从数组创建一组实体 + 关联实体。
-
newEntity() public
从数组创建一个新的实体 + 关联实体。
-
patchEntities() public
将
$data
中传递的每个元素合并到$entities
中找到的实体中,尊重实体上配置的可访问字段。合并是通过匹配$data
和$entities
中每个元素中的主键完成的。 -
patchEntity() public
将传递的
$data
合并到$entity
中,尊重实体上配置的可访问字段。在被更改后返回相同的实体。 -
query() public
为表创建一个新的 SelectQuery 实例。
-
removeBehavior() public
从此表的行为注册表中删除一个行为。
-
rulesChecker() public
返回此实例的 RulesChecker。
-
save() public
根据标记为脏的字段持久化实体,并在成功保存后返回相同的实体,或在出现任何错误的情况下返回 false。
-
saveMany() public
持久化表中的多个实体。
-
saveManyOrFail() public
持久化表中的多个实体。
-
saveOrFail() public
尝试保存实体,如果应用程序规则检查失败,实体包含错误或保存被回调中止,则抛出 PersistenceFailedException。
-
selectQuery() public
创建一个新的选择查询。
-
setAlias() public
设置表别名。
-
setConnection() public
设置连接实例。
-
setDisplayField() public
设置显示字段。
-
setEntityClass() public
设置用于为该表填充行的类。
-
setEventManager() public
返回该对象的 Cake\Event\EventManagerInterface 实例。
-
setPrimaryKey() public
设置主键字段名称。
-
setRegistryAlias() public
设置用于创建该表实例的表注册表键。
-
setSchema() public
设置描述该表属性的模式表对象。
-
setTable() public
设置数据库表名。
-
setValidator() public
此方法在给定名称下存储自定义验证器。
-
subquery() public
创建一个新的 Query 实例,其中禁用字段自动别名。
-
updateAll() public
更新所有匹配的记录。
-
updateQuery() public
创建一个新的更新查询
-
validateUnique() public
验证器方法,用于检查列中值的唯一性。这旨在与验证 API 一起使用,而不是直接调用。
-
validationDefault() public
返回默认验证器对象。子类可以覆盖此函数以在验证器对象中添加默认验证集。
-
validationMethodExists() protected
检查验证方法是否存在。
方法详细说明
__call() ¶ public
__call(string $method, array $args): mixed
处理行为委托和动态查找器。
如果您的 Table 使用任何行为,您可以像调用表对象一样调用它们。
参数
-
string
$method 要调用的方法的名称
-
array
$args 传递给函数的参数列表
返回
混合
抛出
BadMethodCallException
__construct() ¶ public
__construct(array<string, mixed> $config = [])
初始化一个新的实例
$config 数组理解以下键
- table: 要表示的数据库表的名称
- alias: 要分配给此表的别名(默认为表名)
- connection: 要使用的连接实例
- entityClass: 将表示该表中行的实体类的完全命名空间类名。
- schema: 一个 \Cake\Database\Schema\TableSchemaInterface 对象或可以传递给它的数组。
- eventManager: 用于内部事件的事件管理器实例
- behaviors: 一个 BehaviorRegistry。通常不在测试之外使用。
- associations: 一个 AssociationCollection 实例。
- validator: 一个 Validator 实例,它被分配为“默认”验证集,或者是一个关联数组,其中键是验证集的名称,值是 Validator 实例。
参数
-
array<string, mixed>
$config optional 此表的选项列表。
__debugInfo() ¶ public
__debugInfo(): array<string, mixed>
返回一个数组,该数组可用于描述此对象的内部状态。
返回
array<string, mixed>
__get() ¶ public
__get(string $property): Cake\ORM\Association
如果存在,则返回以传递的值命名的关联,否则抛出异常。
参数
-
string
$property 关联名称
返回
Cake\ORM\Association
抛出
Cake\Database\Exception\DatabaseException
如果不存在具有此名称的关联
__isset() ¶ public
__isset(string $property): bool
返回此表是否存在以传递的值命名的关联。
参数
-
string
$property 关联名称
返回
bool
_deleteMany() ¶ protected
_deleteMany(iterableCake\Datasource\EntityInterface> $entities, array<string, mixed> $options = []): Cake\Datasource\EntityInterface|null
参数
-
iterableCake\Datasource\EntityInterface>
$entities 要删除的实体。
-
array<string, mixed>
$options optional 使用的选项。
返回
Cake\Datasource\EntityInterface|null
_dynamicFinder() ¶ protected
_dynamicFinder(string $method, array $args): Cake\ORM\Query\SelectQuery
提供动态 findBy 和 findAllBy 方法。
参数
-
string
$method 触发的方法名称。
-
array
$args 传递给函数的参数列表。
返回
Cake\ORM\Query\SelectQuery
抛出
BadMethodCallException
当存在缺失参数,或当 and 和 or 组合使用时。
_executeTransaction() ¶ protected
_executeTransaction(callable $worker, bool $atomic = true): mixed
处理在事务中执行工作程序的逻辑。
参数
-
callable
$worker 将在事务中运行的工作人员。
-
bool
$atomic optional 是否在数据库事务中执行工作人员。
返回
混合
_getFindOrCreateQuery() ¶ protected
_getFindOrCreateQuery(Cake\ORM\Query\SelectQuery|callable|array $search): Cake\ORM\Query\SelectQuery
获取 findOrCreate() 的查询对象。
参数
-
Cake\ORM\Query\SelectQuery|callable|array
$search 通过它查找现有记录的条件。
返回
Cake\ORM\Query\SelectQuery
_insert() ¶ protected
_insert(Cake\Datasource\EntityInterface $entity, array $data): Cake\Datasource\EntityInterface|false
辅助函数,用于处理在表中插入实体的数据
参数
-
Cake\Datasource\EntityInterface
$entity 从中提取 $data 的主体实体
-
array
$data 需要保存的实际数据
返回
Cake\Datasource\EntityInterface|false
抛出
Cake\Database\Exception\DatabaseException
如果未提供所有主键,或者当表具有复合主键时无法生成主键。或者当表没有主键时。
_newId() ¶ protected
_newId(list<string> $primary): string|null
为新记录生成主键值。
默认情况下,这将使用类型系统来尽可能生成新的主键值。如果您的 ID 生成有特定要求,可以覆盖此方法。
注意:ORM 不会为复合主键生成主键值。您可以在表类中覆盖 _newId()。
参数
-
list<string>
$primary 要获取新 ID 的主键列。
返回
string|null
_onSaveSuccess() ¶ protected
_onSaveSuccess(Cake\Datasource\EntityInterface $entity, ArrayObject<string, mixed> $options): bool
在为该表成功保存实体后,处理子关联的保存并执行 afterSave 逻辑。
参数
-
Cake\Datasource\EntityInterface
$entity 要保存的实体
-
ArrayObject<string, mixed>
$options 用于保存操作的选项
返回
bool
抛出
Cake\ORM\Exception\RolledbackTransactionException
如果在 afterSave 事件中中止了事务。
_processDelete() ¶ protected
_processDelete(Cake\Datasource\EntityInterface $entity, ArrayObject<string, mixed> $options): bool
执行删除操作。
将删除提供的实体。将从任何依赖关联中删除行,并清除 BelongsToMany 关联的连接表。
参数
-
Cake\Datasource\EntityInterface
$entity 要删除的实体。
-
ArrayObject<string, mixed>
$options 删除的选项。
返回
bool
抛出
InvalidArgumentException
如果传递的实体没有主键值
_processFindOrCreate() ¶ protected
_processFindOrCreate(Cake\ORM\Query\SelectQuery|callable|array $search, callable|null $callback = null, array<string, mixed> $options = []): Cake\Datasource\EntityInterface|array
根据传递的选项,执行实体的实际查找和/或创建操作。
参数
-
Cake\ORM\Query\SelectQuery|callable|array
$search 通过它查找现有记录的条件,或者一个可调用的函数,它将自定义查找查询。
-
callable|null
$callback optional 一个回调函数,将为新创建的实体调用。此回调函数将在实体持久化之前调用。
-
array<string, mixed>
$options optional 保存时要使用的选项。
返回
Cake\Datasource\EntityInterface|array
抛出
Cake\ORM\Exception\PersistenceFailedException
当实体无法保存时
InvalidArgumentException
_processSave() ¶ protected
_processSave(Cake\Datasource\EntityInterface $entity, ArrayObject<string, mixed> $options): Cake\Datasource\EntityInterface|false
根据传递的选项执行实体的实际保存操作。
参数
-
Cake\Datasource\EntityInterface
$entity 要保存的实体
-
ArrayObject<string, mixed>
$options 用于保存操作的选项
返回
Cake\Datasource\EntityInterface|false
抛出
Cake\Database\Exception\DatabaseException
当实体缺少某些主键时。
Cake\ORM\Exception\RolledbackTransactionException
如果在 afterSave 事件中中止了事务。
_saveMany() ¶ protected
_saveMany(iterableCake\Datasource\EntityInterface> $entities, array<string, mixed> $options = []): iterableCake\Datasource\EntityInterface>
参数
-
iterableCake\Datasource\EntityInterface>
$entities 要保存的实体。
-
array<string, mixed>
$options optional 为每个实体调用 Table::save() 时使用的选项。
返回
iterableCake\Datasource\EntityInterface>
抛出
Cake\ORM\Exception\PersistenceFailedException
如果实体无法保存。
异常
如果实体无法保存。
_setFieldMatchers() ¶ protected
_setFieldMatchers(array<string, mixed> $options, list<string> $keys): array<string, mixed>
从选项数组中,检查$keys
中描述的键是否为数组,并将这些键的值更改为闭包,这些闭包将在传递行时连接值数组中的每个属性。
这是一个辅助函数,用于结果格式化程序,这些格式化程序在比较值时可以接受复合键。
参数
-
array<string, mixed>
$options 传递给查找器的原始选项
-
list<string>
$keys 要检查 $options 中的键,以从关联值构建匹配器
返回
array<string, mixed>
_transactionCommitted() ¶ protected
_transactionCommitted(bool $atomic, bool $primary): bool
检查调用者是否已对事务执行了提交操作。
参数
-
bool
$atomic 如果使用了原子事务,则为 True。
-
bool
$primary 如果使用了主键,则为 True。
返回
bool
_update() ¶ protected
_update(Cake\Datasource\EntityInterface $entity, array $data): Cake\Datasource\EntityInterface|false
辅助函数,用于处理在表中更新实体数据的操作。
参数
-
Cake\Datasource\EntityInterface
$entity 从中提取 $data 的主体实体
-
array
$data 需要保存的实际数据
返回
Cake\Datasource\EntityInterface|false
抛出
InvalidArgumentException
当主键数据缺失时。
addAssociations() ¶ public
addAssociations(array $params): $this
设置多个关联。
它接受一个数组作为参数,该数组包含按关联类型索引的表名集
$this->Posts->addAssociations([
'belongsTo' => [
'Users' => ['className' => 'App\Model\Table\UsersTable']
],
'hasMany' => ['Comments'],
'belongsToMany' => ['Tags']
]);
每个关联类型接受多个关联,其中键是别名,值是关联配置数据。如果使用数字键,则值将被视为关联别名。
参数
-
array
$params 要绑定的关联集(按关联类型索引)
返回
$this
另请参见
\Cake\ORM\Table::hasOne()
\Cake\ORM\Table::hasMany()
\Cake\ORM\Table::belongsToMany()
addBehavior() ¶ public
addBehavior(string $name, array<string, mixed> $options = []): $this
添加一个行为。
将行为添加到此表的行为集合中。行为提供了一种简单的方法来创建水平可重用的功能,这些功能可以提供类似特征的功能,并允许监听事件。
示例
加载行为,并设置一些设置。
$this->addBehavior('Tree', ['parent' => 'parentId']);
行为通常在 Table::initialize() 期间加载。
参数
-
string
$name 行为的名称。可以是简短的类引用。
-
array<string, mixed>
$options optional 行为要使用的选项。
返回
$this
抛出
RuntimeException
如果行为正在重新加载。
另请参见
addBehaviors() ¶ public
addBehaviors(array $behaviors): $this
将一组行为添加到表的行为集合中。
示例
$this->addBehaviors([
'Timestamp',
'Tree' => ['level' => 'level'],
]);
参数
-
array
$behaviors 要加载的所有行为。
返回
$this
抛出
RuntimeException
如果行为正在重新加载。
aliasField() ¶ public
aliasField(string $field): string
使用表的当前别名别名一个字段。
如果字段已存在别名,则不会执行任何操作。
参数
-
string
$field 要设置别名的字段。
返回
string
associations() ¶ public
associations(): Cake\ORM\AssociationCollection
获取此表的关联集合。
返回
Cake\ORM\AssociationCollection
behaviors() ¶ public
behaviors(): Cake\ORM\BehaviorRegistry
返回此表的行为注册表。
返回
Cake\ORM\BehaviorRegistry
belongsTo() ¶ public
belongsTo(string $associated, array<string, mixed> $options = []): Cake\ORM\Association\BelongsTo
在当前表和目标表之间创建新的“属于”关联。 “属于”关联是 N-1 关系,其中当前表是 N 端,并且在当前表中的每条记录在目标表中都有一个关联记录。
目标表可以通过其名称推断,该名称在第一个参数中提供,或者您可以传递要实例化的类名或直接传递该类的实例。
options 数组接受以下键
- className: 目标表对象的类名
- targetTable: 要用作目标表的表对象的实例
- foreignKey: 要用作外键的字段的名称,如果为 false,则不会使用任何外键
- conditions: 包含用于筛选连接的条件的数组
- joinType: 要使用的连接类型(例如 INNER)
- strategy: 要使用的加载策略。支持“join”和“select”。
- finder: 从该关联加载记录时要使用的查找器方法。默认值为“all”。当策略为“join”时,只会使用查找器中的字段、包含项和 where 条件。
此方法将返回构建的关联对象。
参数
-
string
$associated 目标表的别名。这用于唯一标识关联。
-
array<string, mixed>
$options optional 用于配置关联定义的选项列表
返回
Cake\ORM\Association\BelongsTo
belongsToMany() ¶ public
belongsToMany(string $associated, array<string, mixed> $options = []): Cake\ORM\Association\BelongsToMany
在当前表和目标表之间创建新的“属于多个”关联。 “属于多个”关联是 M-N 关系。
目标表可以通过其名称推断,该名称在第一个参数中提供,或者您可以传递要实例化的类名或直接传递该类的实例。
options 数组接受以下键
- className: 目标表对象的类名。
- targetTable: 要用作目标表的表对象的实例。
- foreignKey: 要用作外键的字段的名称。
- targetForeignKey: 要用作目标外键的字段的名称。
- joinTable: 表示两个表之间链接的表的名称
- through: 如果您选择使用已实例化的链接表,请将此键设置为已配置的 Table 实例,该实例包含指向此关联中源表和目标表两者的关联。
- dependent: 设置为 false,如果您不希望在删除拥有记录时删除连接表记录。
- cascadeCallbacks: 设置为 true,如果您希望 CakePHP 在级联删除时触发回调。如果为 false,ORM 将使用 deleteAll() 删除数据。当为 true 时,将加载连接/连接表记录,然后删除它们。
- conditions: 包含用于筛选连接的条件的数组。
- sort: 此关联的结果应返回的顺序。
- strategy: 用于选择结果的策略,可以是“select”或“subquery”。如果选择 subquery,则用于在源表中返回结果的查询将用作获取目标表中的行的条件。
- saveStrategy: 可以是“append”或“replace”。指示用于保存关联实体的模式。前者只会创建关联关系两端之间的新链接,而后者将进行擦除和替换以在保存时创建传递实体之间的链接。
- strategy: 要使用的加载策略。支持“select”和“subquery”。
- finder: 从该关联加载记录时要使用的查找器方法。默认值为“all”。
此方法将返回构建的关联对象。
参数
-
string
$associated 目标表的别名。这用于唯一标识关联。
-
array<string, mixed>
$options optional 用于配置关联定义的选项列表
返回
Cake\ORM\Association\BelongsToMany
buildRules() ¶ public
buildRules(Cake\Datasource\RulesChecker $rules): Cake\ORM\RulesChecker
在修改提供的 RulesChecker 对象后,返回该对象。
子类应覆盖此方法以初始化要应用于此实例保存的实体的规则。
参数
-
Cake\Datasource\RulesChecker
$rules 要修改的规则对象。
返回
Cake\ORM\RulesChecker
callFinder() ¶ public
callFinder(string $type, Cake\ORM\Query\SelectQuery<TSubject> $query, mixed ...$args): Cake\ORM\Query\SelectQuery<TSubject>
调用查找器方法并将其应用于传递的查询。
参数
-
string
$type 要调用的查找器的名称。
-
Cake\ORM\Query\SelectQuery<TSubject>
$query 要将查找器选项应用到的查询对象。
-
mixed
...$args 与查找器特定参数匹配的参数
返回
Cake\ORM\Query\SelectQuery<TSubject>
抛出
BadMethodCallException
checkAliasLengths() ¶ protected
checkAliasLengths(): void
检查用于查询的所有表名 + 列名组合是否符合数据库驱动程序允许的最大长度。
返回
void
抛出
Cake\Database\Exception\DatabaseException
当别名组合过长时
checkRules() ¶ public
checkRules(Cake\Datasource\EntityInterface $entity, string $operation = RulesChecker::CREATE, ArrayObject<string, mixed>|array|null $options = null): bool
返回传递的实体是否符合存储在规则检查器中的所有规则。
参数
-
Cake\Datasource\EntityInterface
$entity 要检查有效性的实体。
-
string
$operation optional 正在执行的操作。可以是“create”、“update”或“delete”。
-
ArrayObject<string, mixed>|array|null
$options optional 要传递给规则的选项。
返回
bool
createValidator() ¶ protected
createValidator(string $name): Cake\Validation\Validator
使用类中的自定义方法创建验证器。
此方法仅用于构建新的验证器,它不会将验证器存储在您的对象中。如果您想构建和重用验证器,请使用 getValidator() 方法。
参数
-
string
$name 要创建的验证集的名称。
返回
Cake\Validation\Validator
抛出
InvalidArgumentException
defaultConnectionName() ¶ public static
defaultConnectionName(): string
获取默认连接名称。
此方法用于在通过 TableLocator 创建实例而没有连接时获取回退连接名称。
返回
string
另请参见
delete() ¶ public
delete(Cake\Datasource\EntityInterface $entity, array<string, mixed> $options = []): bool
删除单个实体。
对于 HasMany 和 HasOne 关联,将根据 dependent 选项删除记录。BelongsToMany 关联中的连接表记录将始终被删除。您可以在定义关联时使用 cascadeCallbacks
选项来更改关联数据的删除方式。
选项
atomic
默认值为 true。当为 true 时,删除操作将在事务中发生。checkRules
默认值为 true。在删除记录之前检查删除规则。
事件
Model.beforeDelete
在删除操作发生之前触发。如果停止,删除操作将被中止。接收事件、实体和选项。Model.afterDelete
在删除操作成功后触发。接收事件、实体和选项。Model.afterDeleteCommit
在原子删除的事务提交后触发。接收事件、实体和选项。
options 参数将转换为 \ArrayObject 实例,持续时间为回调,这允许侦听器修改删除操作中使用的选项。
参数
-
Cake\Datasource\EntityInterface
$entity 要删除的实体。
-
array<string, mixed>
$options optional 删除的选项。
返回
bool
deleteAll() ¶ public
deleteAll(Cake\Database\Expression\QueryExpressionClosure|array|string|null $conditions): int
删除与提供的条件匹配的所有记录。
此方法不会触发 beforeDelete/afterDelete 事件。如果您需要这些事件,请先加载记录集合并删除它们。
此方法不会在关联的 cascade
属性上执行。如果您需要级联删除并结合此方法使用,则应使用数据库外键 + ON CASCADE 规则。
参数
-
Cake\Database\Expression\QueryExpressionClosure|array|string|null
$conditions 要使用的条件,接受 Query::where() 可以接受的任何内容。
返回
int
deleteMany() ¶ public
deleteMany(iterableCake\Datasource\EntityInterface> $entities, array<string, mixed> $options = []): iterableCake\Datasource\EntityInterface>|false
删除表中的多个实体。
这些记录将在事务中删除,如果由于验证失败或数据库错误导致任何一条记录无法删除,则事务将回滚。
参数
-
iterableCake\Datasource\EntityInterface>
$entities 要删除的实体。
-
array<string, mixed>
$options optional 为每个实体调用 Table::save() 时使用的选项。
返回
iterableCake\Datasource\EntityInterface>|false
另请参见
deleteManyOrFail() ¶ public
deleteManyOrFail(iterableCake\Datasource\EntityInterface> $entities, array<string, mixed> $options = []): iterableCake\Datasource\EntityInterface>
删除表中的多个实体。
这些记录将在事务中删除,如果由于验证失败或数据库错误导致任何一条记录无法删除,则事务将回滚。
参数
-
iterableCake\Datasource\EntityInterface>
$entities 要删除的实体。
-
array<string, mixed>
$options optional 为每个实体调用 Table::save() 时使用的选项。
返回
iterableCake\Datasource\EntityInterface>
抛出
Cake\ORM\Exception\PersistenceFailedException
另请参见
deleteOrFail() ¶ public
deleteOrFail(Cake\Datasource\EntityInterface $entity, array<string, mixed> $options = []): true
尝试删除实体,如果实体是新的,没有主键值,应用程序规则检查失败或删除被回调中止,则抛出 PersistenceFailedException。
参数
-
Cake\Datasource\EntityInterface
$entity 要删除的实体。
-
array<string, mixed>
$options optional 删除的选项。
返回
true
抛出
Cake\ORM\Exception\PersistenceFailedException
另请参见
deleteQuery() ¶ public
deleteQuery(): Cake\ORM\Query\DeleteQuery
创建一个新的删除查询。
返回
Cake\ORM\Query\DeleteQuery
dispatchEvent() ¶ public
dispatchEvent(string $name, array $data = [], TSubject|null $subject = null): Cake\Event\EventInterface<TSubject>
用于创建和分发事件的包装器。
返回已派发的事件。
参数
-
string
$name 事件的名称。
-
array
$data optional 您希望通过此事件传输的任何值,侦听器都可以读取它。
-
TSubject|null
$subject optional 此事件适用的对象(默认情况下为 $this)。
返回
Cake\Event\EventInterface<TSubject>
exists() ¶ public
exists(QueryExpression|Closure|array|string|null $conditions): bool
如果此存储库中存在任何与指定条件匹配的记录,则返回 true。
参数
-
QueryExpression|Closure|array|string|null
$conditions
返回
bool
find() ¶ public
find(string $type = 'all', mixed ...$args): Cake\ORM\Query\SelectQuery
为当前存储库创建一个新的查询,并根据所选搜索类型应用一些默认值。
Model.beforeFind 事件
每个 find() 将针对所有附加的侦听器触发 Model.beforeFind
事件。任何侦听器都可以使用 $query 设置有效的结果集。
默认情况下,以下特殊命名参数将被识别,用作选择查询选项
- 字段
- 条件
- 排序
- 限制
- 偏移
- 页码
- 分组
- 条件过滤
- 包含
- 关联
用法
$query = $articles->find('all',
conditions: ['published' => 1],
limit: 10,
contain: ['Users', 'Comments']
);
使用构建器接口
$query = $articles->find()
->where(['published' => 1])
->limit(10)
->contain(['Users', 'Comments']);
调用查找器
find() 方法是自定义查找器方法的入口点。您可以通过指定类型来调用查找器。
这将调用 findPublished
方法
$query = $articles->find('published');
类型化查找器参数
查找器必须以 SelectQuery
实例作为其第一个参数,以及任何其他需要的参数。
在这里,查找器 “findByCategory” 有一个整数 $category
参数
function findByCategory(SelectQuery $query, int $category): SelectQuery
{
return $query;
}
此查找器可以这样调用
$query = $articles->find('byCategory', $category);
或者使用命名参数作为
$query = $articles->find(type: 'byCategory', category: $category);
参数
-
string
$type 可选 要执行的查询类型
-
mixed
...$args 与查找器特定参数匹配的参数
返回
Cake\ORM\Query\SelectQuery
findAll() ¶ public
findAll(Cake\ORM\Query\SelectQuery $query): Cake\ORM\Query\SelectQuery
按原样返回查询。
默认情况下 findAll() 不应用任何查询子句,您可以在子类中覆盖此方法来修改 find('all')
的工作方式。
参数
-
Cake\ORM\Query\SelectQuery
$query 要查找的查询
返回
Cake\ORM\Query\SelectQuery
findAssociation() ¶ protected
findAssociation(string $name): Cake\ORM\Association|null
返回为指定别名(如果有)配置的关联对象。
name 参数也支持点语法来访问更深层的关联。
$users = $this->getAssociation('Articles.Comments.Users');
参数
-
string
$name 关联使用的别名。
返回
Cake\ORM\Association|null
findList() ¶ public
findList(Cake\ORM\Query\SelectQuery $query, Closure|array|string|null $keyField = null, Closure|array|string|null $valueField = null, Closure|array|string|null $groupField = null, string $valueSeparator = ' '): Cake\ORM\Query\SelectQuery
设置查询对象,以便结果显示为索引数组,这在任何需要列表的地方(例如填充输入选择框)都很有用。
调用此查找器时,传递的字段用于确定使用什么作为数组键、值以及可选的将结果分组的方式。默认情况下,模型的主键用于键,显示字段用作值。
此查找器的结果将采用以下形式
[
1 => 'value for id 1',
2 => 'value for id 2',
4 => 'value for id 4'
]
您可以指定哪个属性将用作键,哪个用作值,未指定时,它将分别使用调用 primaryKey
和 displayField
在此表中的结果
$table->find('list', keyField: 'name', valueField: 'age');
valueField
也可以是数组,在这种情况下,您还可以指定 valueSeparator
选项来控制如何连接值
$table->find('list', valueField: ['first_name', 'last_name'], valueSeparator: ' | ');
此查找器的结果将采用以下形式
[
1 => 'John | Doe',
2 => 'Steve | Smith'
]
当结果共享一个属性时,可以将结果放在更大的组中,您可以通过设置 groupField
来自定义用于分组的属性
$table->find('list', groupField: 'category_id');
使用 groupField
时,结果将以这种格式返回
[
'group_1' => [
1 => 'value for id 1',
2 => 'value for id 2',
]
'group_2' => [
4 => 'value for id 4'
]
]
参数
-
Cake\ORM\Query\SelectQuery
$query 要查找的查询
-
Closure|array|string|null
$keyField 可选 -
Closure|array|string|null
$valueField 可选 -
Closure|array|string|null
$groupField 可选 -
string
$valueSeparator 可选
返回
Cake\ORM\Query\SelectQuery
findOrCreate() ¶ public
findOrCreate(Cake\ORM\Query\SelectQuery|callable|array $search, callable|null $callback = null, array<string, mixed> $options = []): Cake\Datasource\EntityInterface
查找现有记录或创建一个新的记录。
将执行 find() 以使用 $search 中定义的属性定位现有记录。如果记录与条件匹配,则将返回第一条记录。
如果找不到任何记录,将使用 $search 属性创建一个新的实体。如果提供了回调,它将被调用,允许您定义其他默认值。新实体将被保存并返回。
如果您的查找条件需要自定义排序、关联或条件,则 $search 参数可以是可调用函数,该函数将 Query 作为参数,或者作为 $search 参数传递的 \Cake\ORM\Query\SelectQuery 对象。允许您自定义查找结果。
选项
选项数组传递给 save 方法,除了以下键
- atomic: 是否在数据库事务中执行 find、save 和回调的方法(默认:true)
- defaults: 是否将搜索条件用作新实体的默认值(默认:true)
参数
-
Cake\ORM\Query\SelectQuery|callable|array
$search 用于查找现有记录的条件。请注意,当您传递查询对象时,您必须使用该方法的第二个参数来修改实体数据,然后再保存。
-
callable|null
$callback optional 一个回调函数,将为新创建的实体调用。此回调函数将在实体持久化之前调用。
-
array<string, mixed>
$options optional 保存时要使用的选项。
返回
Cake\Datasource\EntityInterface
抛出
Cake\ORM\Exception\PersistenceFailedException
当实体无法保存时
findThreaded() ¶ public
findThreaded(Cake\ORM\Query\SelectQuery $query, Closure|array|string|null $keyField = null, Closure|array|string $parentField = 'parent_id', string $nestingKey = 'children'): Cake\ORM\Query\SelectQuery
此查找器的结果将是嵌套数组,如果要使用模型数据的 parent_id 字段来构建嵌套结果,则适用。
属于父行的值(基于它们的 parent_id 值)将使用 children
属性递归嵌套在父行值中
您可以自定义用于嵌套结果的字段,默认情况下使用主键和 parent_id
字段。如果您想更改这些默认值,您需要提供 keyField
、parentField
或 nestingKey
参数
$table->find('threaded', keyField: 'id', parentField: 'ancestor_id', nestingKey: 'children');
参数
-
Cake\ORM\Query\SelectQuery
$query 要查找的查询
-
Closure|array|string|null
$keyField 可选 键字段的路径。
-
Closure|array|string
$parentField 可选 父字段的路径。
-
string
$nestingKey 可选 嵌套子节点的键。
返回
Cake\ORM\Query\SelectQuery
get() ¶ public
get(mixed $primaryKey, array|string $finder = 'all', Psr\SimpleCache\CacheInterface|string|null $cache = null, Closure|string|null $cacheKey = null, mixed ...$args): Cake\Datasource\EntityInterface
根据主键查找记录后返回单个记录,如果未找到记录,此方法将抛出异常。
用法
获取文章和一些关系
$article = $articles->get(1, ['contain' => ['Users', 'Comments']]);
参数
-
mixed
$primaryKey 要查找的主键值
-
array|string
$finder 可选 要使用的查找器。传递选项数组已弃用。
-
Psr\SimpleCache\CacheInterface|string|null
$cache 可选 要使用的缓存配置。默认为
null
,即不缓存。-
Closure|string|null
$cacheKey 可选 要使用的缓存键。如果未提供,则在
$cache
不为 null 时将自动生成。-
mixed
...$args 查询选项或查找器特定参数的参数。
返回
Cake\Datasource\EntityInterface
抛出
Cake\Datasource\Exception\RecordNotFoundException
如果找不到具有此 ID 的记录
Cake\Datasource\Exception\InvalidPrimaryKeyException
当 $primaryKey 的元素数量不正确时。
另请参见
getAssociation() ¶ public
getAssociation(string $name): Cake\ORM\Association
返回为指定别名配置的关联对象。
name 参数也支持点语法来访问更深层的关联。
$users = $this->getAssociation('Articles.Comments.Users');
请注意,此方法要求关联存在,否则将抛出异常。如果您不确定,请在调用此方法之前使用 hasAssociation()。
参数
-
string
$name 关联使用的别名。
返回
Cake\ORM\Association
抛出
InvalidArgumentException
getBehavior() ¶ public
getBehavior(string $name): Cake\ORM\Behavior
从注册表中获取行为。
参数
-
string
$name 要从注册表中获取的行为别名。
返回
Cake\ORM\Behavior
抛出
InvalidArgumentException
如果行为不存在。
getConnection() ¶ public
getConnection(): Cake\Database\Connection
返回连接实例。
返回
Cake\Database\Connection
getEntityClass() ¶ public
getEntityClass(): class-stringCake\Datasource\EntityInterface>
返回用于为此表的水化行类。
返回
class-stringCake\Datasource\EntityInterface>
getEventManager() ¶ public
getEventManager(): Cake\Event\EventManagerInterface
返回此对象的 Cake\Event\EventManager 管理器实例。
您可以使用此实例向对象事件注册任何新的监听器或回调,或者创建您自己的事件并随意触发它们。
返回
Cake\Event\EventManagerInterface
getSchema() ¶ public
getSchema(): Cake\Database\Schema\TableSchemaInterface
返回描述此表属性的架构表对象。
返回
Cake\Database\Schema\TableSchemaInterface
getValidator() ¶ public
getValidator(string|null $name = null): Cake\Validation\Validator
返回标记为 $name 的验证规则。可以使用多个不同命名的验证集,这在需要从系统中的不同例程保存时使用不同规则时很有用。
如果之前没有设置验证器,此方法将使用您类中的方法构建验证器。
例如,如果您希望创建一个名为 'forSubscription' 的验证集,您需要在您的 Table 子类中创建一个方法,如下所示
public function validationForSubscription($validator)
{
return $validator
->add('email', 'valid-email', ['rule' => 'email'])
->add('password', 'valid', ['rule' => 'notBlank'])
->requirePresence('username');
}
$validator = $this->getValidator('forSubscription');
如果您希望有一个在没有指定其他集合的情况下适用的验证集,您可以在 Table 子类的 validationDefault
中实现该方法。
如果没有提供 $name 参数,则将返回默认验证器。您可以在 DEFAULT_VALIDATOR
类常量中配置默认验证器名称。
参数
-
string|null
$name 可选 要返回的验证集的名称。
返回
Cake\Validation\Validator
hasAssociation() ¶ public
hasAssociation(string $name): bool
检查此 Table 实例上是否存在特定关联。
name 参数也支持点语法来访问更深层的关联。
$hasUsers = $this->hasAssociation('Articles.Comments.Users');
参数
-
string
$name 关联使用的别名。
返回
bool
hasBehavior() ¶ public
hasBehavior(string $name): bool
检查是否已加载具有给定别名的行为。
参数
-
string
$name 要检查的行为别名。
返回
bool
hasField() ¶ public
hasField(string $field): bool
测试表是否具有特定字段/列。
委托给架构对象,并使用 Schema\Table 实例检查列是否存在。
参数
-
string
$field 要检查的字段。
返回
bool
hasFinder() ¶ public
hasFinder(string $type): bool
如果表存在查找器,则返回 true。
参数
-
string
$type 要检查的查找器名称
返回
bool
hasMany() ¶ public
hasMany(string $associated, array<string, mixed> $options = []): Cake\ORM\Association\HasMany
在当前表和目标表之间创建新的“具有多个”关联。 “具有多个”关联是 1-N 关系。
目标表可以通过其名称推断,该名称在第一个参数中提供,或者您可以传递要实例化的类名或直接传递该类的实例。
options 数组接受以下键
- className: 目标表对象的类名
- targetTable: 要用作目标表的表对象的实例
- foreignKey: 要用作外键的字段的名称,如果为 false,则不会使用任何外键
- dependent: 如果您希望在从此表中删除实体时,CakePHP 将级联删除到关联表,则将其设置为 true。关联表上的删除操作不会进一步级联。要获得递归级联,也请启用
cascadeCallbacks
。如果您不想让 CakePHP 删除关联数据,或者当您使用数据库约束时,请将其设置为 false。 - cascadeCallbacks: 如果您希望 CakePHP 在级联删除时触发回调,则将其设置为 true。如果为 false,ORM 将使用 deleteAll() 来删除数据。当为 true 时,记录将被加载,然后删除。
- conditions: 包含用于筛选连接的条件的数组
- sort: 此关联结果返回的顺序
- saveStrategy: “append” 或 “replace”。当为 “append” 时,当前记录将附加到数据库中的任何记录。当为 “replace” 时,当前集中不存在的关联记录将被删除。如果外键是可为空的列,或者如果
dependent
为 true,则记录将成为孤儿。 - strategy: 用于选择结果的策略,可以是“select”或“subquery”。如果选择 subquery,则用于在源表中返回结果的查询将用作获取目标表中的行的条件。
- finder: 从该关联加载记录时要使用的查找器方法。默认值为“all”。
此方法将返回构建的关联对象。
参数
-
string
$associated 目标表的别名。这用于唯一标识关联。
-
array<string, mixed>
$options optional 用于配置关联定义的选项列表
返回
Cake\ORM\Association\HasMany
hasOne() ¶ public
hasOne(string $associated, array<string, mixed> $options = []): Cake\ORM\Association\HasOne
在当前表和目标表之间创建新的“具有一个”关联。 “具有一个”关联是 1-1 关系。
目标表可以通过其名称推断,该名称在第一个参数中提供,或者您可以传递要实例化的类名或直接传递该类的实例。
options 数组接受以下键
- className: 目标表对象的类名
- targetTable: 要用作目标表的表对象的实例
- foreignKey: 要用作外键的字段的名称,如果为 false,则不会使用任何外键
- dependent: 如果您希望在从此表中删除实体时,CakePHP 将级联删除到关联表,则将其设置为 true。关联表上的删除操作不会进一步级联。要获得递归级联,也请启用
cascadeCallbacks
。如果您不想让 CakePHP 删除关联数据,或者当您使用数据库约束时,请将其设置为 false。 - cascadeCallbacks: 如果您希望 CakePHP 在级联删除时触发回调,则将其设置为 true。如果为 false,ORM 将使用 deleteAll() 来删除数据。当为 true 时,记录将被加载,然后删除。
- conditions: 包含用于筛选连接的条件的数组
- joinType: 要使用的连接类型(例如 LEFT)
- strategy: 要使用的加载策略。支持“join”和“select”。
- finder: 从该关联加载记录时要使用的查找器方法。默认值为“all”。当策略为“join”时,只会使用查找器中的字段、包含项和 where 条件。
此方法将返回构建的关联对象。
参数
-
string
$associated 目标表的别名。这用于唯一标识关联。
-
array<string, mixed>
$options optional 用于配置关联定义的选项列表
返回
Cake\ORM\Association\HasOne
implementedEvents() ¶ public
implementedEvents(): array<string, mixed>
获取此表感兴趣的模型回调。
通过实现传统方法,假定表类对相关事件感兴趣。
如果您需要添加非传统事件监听器,或者您希望您的表监听非标准事件,请覆盖此方法。
传统方法映射为
- Model.beforeMarshal => beforeMarshal
- Model.afterMarshal => afterMarshal
- Model.buildValidator => buildValidator
- Model.beforeFind => beforeFind
- Model.beforeSave => beforeSave
- Model.afterSave => afterSave
- Model.afterSaveCommit => afterSaveCommit
- Model.beforeDelete => beforeDelete
- Model.afterDelete => afterDelete
- Model.afterDeleteCommit => afterDeleteCommit
- Model.beforeRules => beforeRules
- Model.afterRules => afterRules
返回
array<string, mixed>
initialize() ¶ public
initialize(array<string, mixed> $config): void
初始化表实例。在构造函数之后调用。
您可以使用此方法定义关联、附加行为、定义验证并执行您需要的任何其他初始化逻辑。
public function initialize(array $config)
{
$this->belongsTo('Users');
$this->belongsToMany('Tagging.Tags');
$this->setPrimaryKey('something_else');
}
参数
-
array<string, mixed>
$config 传递给构造函数的配置选项
返回
void
insertQuery() ¶ public
insertQuery(): Cake\ORM\Query\InsertQuery
创建一个新的插入查询。
返回
Cake\ORM\Query\InsertQuery
invokeFinder() ¶ public
invokeFinder(Closure $callable, Cake\ORM\Query\SelectQuery<TSubject> $query, array $args): Cake\ORM\Query\SelectQuery<TSubject>
参数
-
Closure
$callable 可调用对象。
-
Cake\ORM\Query\SelectQuery<TSubject>
$query 查询对象。
-
array
$args 可调用对象的参数。
返回
Cake\ORM\Query\SelectQuery<TSubject>
loadInto() ¶ public
loadInto(Cake\Datasource\EntityInterface|arrayCake\Datasource\EntityInterface> $entities, array $contain): Cake\Datasource\EntityInterface|arrayCake\Datasource\EntityInterface>
通过在数据库中执行额外的查询并将结果合并到相应的属性中,将指定的关联加载到传递的实体或实体列表中。
示例
$user = $usersTable->get(1);
$user = $usersTable->loadInto($user, ['Articles.Tags', 'Articles.Comments']);
echo $user->articles[0]->title;
您也可以一次加载多个实体的关联
示例
$users = $usersTable->find()->where([...])->toList();
$users = $usersTable->loadInto($users, ['Articles.Tags', 'Articles.Comments']);
echo $user[1]->articles[0]->title;
要加载的关联的属性将在每个实体上被覆盖。
参数
-
Cake\Datasource\EntityInterface|arrayCake\Datasource\EntityInterface>
$entities 单个实体或实体列表
-
array
$contain 一个与
contain()
兼容的数组。
返回
Cake\Datasource\EntityInterface|arrayCake\Datasource\EntityInterface>
另请参见
marshaller() ¶ public
marshaller(): Cake\ORM\Marshaller
获取用于将数组数据编组/转换为对象的工具。
如果您希望表对象使用自定义编组逻辑,请覆盖此方法。
返回
Cake\ORM\Marshaller
另请参见
newEmptyEntity() ¶ public
newEmptyEntity(): Cake\Datasource\EntityInterface
这将创建一个新的实体对象。
小心:这不会触发任何字段验证。此实体可以作为空记录持久化,而不会出现验证错误。在保存之前,请始终修补所需的字段。
返回
Cake\Datasource\EntityInterface
newEntities() ¶ public
newEntities(array $data, array<string, mixed> $options = []): arrayCake\Datasource\EntityInterface>
从数组创建一组实体 + 关联实体。
默认情况下,此表上的所有关联都将被填充。您可以使用 options 参数来限制哪些关联被构建,或包含更深层的关联
$articles = $this->Articles->newEntities(
$this->request->getData(),
['associated' => ['Tags', 'Comments.Users']]
);
您可以通过传递 fields
选项来限制构建的实体中将出现的字段,该选项也适用于关联
$articles = $this->Articles->newEntities($this->request->getData(), [
'fields' => ['title', 'body', 'tags', 'comments'],
'associated' => ['Tags', 'Comments.Users' => ['fields' => 'username']]
]
);
您可以使用 Model.beforeMarshal
事件在请求数据转换为实体之前修改它。
参数
-
array
$data 用于构建实体的数据。
-
array<string, mixed>
$options optional 对象填充的选项列表。
返回
arrayCake\Datasource\EntityInterface>
newEntity() ¶ public
newEntity(array $data, array<string, mixed> $options = []): Cake\Datasource\EntityInterface
从数组创建一个新的实体 + 关联实体。
默认情况下,此表上的所有关联都将被填充。您可以使用 options 参数来限制哪些关联被构建,或包含更深层的关联
$article = $this->Articles->newEntity(
$this->request->getData(),
['associated' => ['Tags', 'Comments.Users']]
);
您可以通过传递 fields
选项来限制构建的实体中将出现的字段,该选项也适用于关联
$article = $this->Articles->newEntity($this->request->getData(), [
'fields' => ['title', 'body', 'tags', 'comments'],
'associated' => ['Tags', 'Comments.Users' => ['fields' => 'username']]
]
);
fields
选项可以从最终进入实体的输入数据中删除或限制输入数据。如果您想放宽实体的默认可访问字段,可以使用 accessibleFields
选项
$article = $this->Articles->newEntity(
$this->request->getData(),
['accessibleFields' => ['protected_field' => true]]
);
默认情况下,数据在传递给新实体之前会进行验证。如果字段无效,则这些字段不会出现在结果对象中。validate
选项可用于禁用对传递数据的验证
$article = $this->Articles->newEntity(
$this->request->getData(),
['validate' => false]
);
您也可以在 validate
选项中传递要使用的验证器名称。如果将 null
传递给此函数的第一个参数,则不会执行任何验证。
您可以使用 Model.beforeMarshal
事件在请求数据转换为实体之前修改它。
参数
-
array
$data 用于构建实体的数据。
-
array<string, mixed>
$options optional 对象填充的选项列表。
返回
Cake\Datasource\EntityInterface
另请参见
patchEntities() ¶ public
patchEntities(iterableCake\Datasource\EntityInterface> $entities, array $data, array<string, mixed> $options = []): arrayCake\Datasource\EntityInterface>
将 $data
中传递的每个元素合并到 $entities
中找到的实体中,尊重实体上配置的可访问字段。合并是通过匹配 $data
和 $entities
中每个元素中的主键完成的。
无法与 $data
中的任何记录匹配的 $entities
中的这些条目将被丢弃。无法匹配的 $data
中的记录将被编组为新实体。
合并 HasMany 或 BelongsToMany 关联时,$data
数组中的所有实体都将出现,那些可以通过主键匹配的实体将获得数据合并,但那些无法匹配的实体将被丢弃。
您可以通过传递 fields
选项来限制合并的实体中将出现的字段,该选项也适用于关联
$articles = $this->Articles->patchEntities($articles, $this->request->getData(), [
'fields' => ['title', 'body', 'tags', 'comments'],
'associated' => ['Tags', 'Comments.Users' => ['fields' => 'username']]
]
);
您可以使用 Model.beforeMarshal
事件在请求数据转换为实体之前修改它。
参数
-
iterableCake\Datasource\EntityInterface>
$entities 将获得数据合并的实体
-
array
$data 要合并到实体中的数组列表
-
array<string, mixed>
$options optional 对象填充的选项列表。
返回
arrayCake\Datasource\EntityInterface>
patchEntity() ¶ public
patchEntity(Cake\Datasource\EntityInterface $entity, array $data, array<string, mixed> $options = []): Cake\Datasource\EntityInterface
将传递的 $data
合并到 $entity
中,尊重实体上配置的可访问字段。在被更改后返回相同的实体。
合并 HasMany 或 BelongsToMany 关联时,$data
数组中的所有实体都将出现,那些可以通过主键匹配的实体将获得数据合并,但那些无法匹配的实体将被丢弃。
您可以通过传递 fields
选项来限制合并的实体中将出现的字段,该选项也适用于关联
$article = $this->Articles->patchEntity($article, $this->request->getData(), [
'fields' => ['title', 'body', 'tags', 'comments'],
'associated' => ['Tags', 'Comments.Users' => ['fields' => 'username']]
]
);
$article = $this->Articles->patchEntity($article, $this->request->getData(), [
'associated' => [
'Tags' => ['accessibleFields' => ['*' => true]]
]
]);
默认情况下,数据在传递给实体之前会进行验证。如果字段无效,则这些字段不会分配给实体。validate
选项可用于禁用对传递数据的验证
$article = $this->patchEntity($article, $this->request->getData(),[
'validate' => false
]);
您可以使用 Model.beforeMarshal
事件在请求数据转换为实体之前修改它。
修补标量值(null/boolean/string/integer/float)时,如果属性目前具有相同的值,则不会调用 setter,并且属性不会被标记为脏。这是一个优化,用于在持久化实体时防止不必要的字段更新。
参数
-
Cake\Datasource\EntityInterface
$entity 将获得数据合并的实体
-
array
$data 要合并到实体中的键值字段列表
-
array<string, mixed>
$options optional 对象填充的选项列表。
返回
Cake\Datasource\EntityInterface
另请参见
query() ¶ public
query(): Cake\ORM\Query\SelectQuery
为表创建一个新的 SelectQuery 实例。
返回
Cake\ORM\Query\SelectQuery
removeBehavior() ¶ public
removeBehavior(string $name): $this
从此表的行为注册表中删除一个行为。
示例
从此表中删除行为。
$this->removeBehavior('Tree');
参数
-
string
$name 行为添加时的别名。
返回
$this
另请参见
rulesChecker() ¶ public
rulesChecker(): Cake\Datasource\RulesChecker
返回此实例的 RulesChecker。
RulesChecker 对象用于测试实体的规则有效性,这些规则可能涉及复杂的逻辑或需要从相关数据源中获取的数据。
返回
Cake\Datasource\RulesChecker
另请参见
save() ¶ public
save(Cake\Datasource\EntityInterface $entity, array<string, mixed> $options = []): Cake\Datasource\EntityInterface|false
根据标记为脏的字段持久化实体,并在成功保存后返回相同的实体,或在出现任何错误的情况下返回 false。
选项
options 数组接受以下键
- atomic: 是否在数据库事务中执行保存和回调(默认值:true)
- checkRules: 是否在保存之前检查实体上的规则,如果检查失败,则会中止保存操作。(默认值:true)
- associated: 如果
true
,则在将与关联定义的属性标记为脏时,将保存传递的$entity
中找到的一级关联实体。如果是一个数组,它将被解释为要保存的关联列表。通过将自定义选项设为数组值,可以使用此键为关联表对象上的保存提供不同的选项。如果为false
,则不会保存任何关联记录。(默认值:true
) - checkExisting: 是否检查实体是否已存在,假设实体被标记为非新实体,并且主键已设置。
事件
保存时,此方法将触发四个事件
- Model.beforeRules: 如果
$options
中的checkRules
键未设置为 false,则在对传递的实体进行任何规则检查之前触发。侦听器将接收实体、选项数组和操作类型作为参数。如果事件被停止,规则检查结果将被设置为事件本身的结果。 - Model.afterRules: 在对实体调用
checkRules()
方法后立即触发。侦听器将接收实体、选项数组、检查规则的结果和操作类型作为参数。如果事件被停止,检查结果将被设置为事件本身的结果。 - Model.beforeSave: 在计算要持久化的字段列表之前立即触发。它接收实体和选项作为参数。选项数组被传递为 ArrayObject,因此其中的任何更改都会反映在每个侦听器中,并在事件结束时被记住,以便它可以用于保存操作的其余部分。在任何侦听器中返回 false 将中止保存过程。如果使用事件 API 停止事件,事件对象的
result
属性将被返回。当在侦听器中实现自己的保存策略时,这非常有用。 - Model.afterSave: 在成功插入或保存后触发,侦听器将接收实体和选项数组作为参数。执行的操作类型(插入或更新)可以通过检查实体的方法
isNew
来确定,true 表示插入,false 表示更新。 - Model.afterSaveCommit: 在为原子保存提交事务后触发,侦听器将接收实体和选项数组作为参数。
此方法将确定传递的实体是否需要在数据库中插入或更新。它通过检查实体上的 isNew
方法来做到这一点。如果要保存的实体从其 errors()
方法返回非空值,则不会保存它。
在关联表上保存
默认情况下,此方法将持久化属于关联表的实体,只要与在此表中为关联设置的属性名称匹配的脏属性。可以控制要保存哪些关联,并为保存它们传递其他选项。
// Only save the comments association
$articles->save($entity, ['associated' => ['Comments']]);
// Save the company, the employees and related addresses for each of them.
// For employees do not check the entity rules
$companies->save($entity, [
'associated' => [
'Employees' => [
'associated' => ['Addresses'],
'checkRules' => false
]
]
]);
// Save no associations
$articles->save($entity, ['associated' => false]);
参数
-
Cake\Datasource\EntityInterface
$entity 要保存的实体
-
array<string, mixed>
$options optional 保存时要使用的选项。
返回
Cake\Datasource\EntityInterface|false
抛出
Cake\ORM\Exception\RolledbackTransactionException
如果在 afterSave 事件中中止了事务。
saveMany() ¶ public
saveMany(iterableCake\Datasource\EntityInterface> $entities, array<string, mixed> $options = []): iterableCake\Datasource\EntityInterface>|false
持久化表中的多个实体。
记录将在事务中保存,如果任何一个记录由于验证失败或数据库错误而无法保存,则事务将回滚。
参数
-
iterableCake\Datasource\EntityInterface>
$entities 要保存的实体。
-
array<string, mixed>
$options optional 为每个实体调用 Table::save() 时使用的选项。
返回
iterableCake\Datasource\EntityInterface>|false
抛出
异常
saveManyOrFail() ¶ public
saveManyOrFail(iterableCake\Datasource\EntityInterface> $entities, array<string, mixed> $options = []): iterableCake\Datasource\EntityInterface>
持久化表中的多个实体。
记录将在事务中保存,如果任何一个记录由于验证失败或数据库错误而无法保存,则事务将回滚。
参数
-
iterableCake\Datasource\EntityInterface>
$entities 要保存的实体。
-
array<string, mixed>
$options optional 为每个实体调用 Table::save() 时使用的选项。
返回
iterableCake\Datasource\EntityInterface>
抛出
异常
Cake\ORM\Exception\PersistenceFailedException
如果实体无法保存。
saveOrFail() ¶ public
saveOrFail(Cake\Datasource\EntityInterface $entity, array<string, mixed> $options = []): Cake\Datasource\EntityInterface
尝试保存实体,如果应用程序规则检查失败,实体包含错误或保存被回调中止,则抛出 PersistenceFailedException。
参数
-
Cake\Datasource\EntityInterface
$entity 要保存的实体
-
array<string, mixed>
$options optional 保存时要使用的选项。
返回
Cake\Datasource\EntityInterface
抛出
Cake\ORM\Exception\PersistenceFailedException
当实体无法保存时
另请参见
selectQuery() ¶ public
selectQuery(): Cake\ORM\Query\SelectQuery
创建一个新的选择查询。
返回
Cake\ORM\Query\SelectQuery
setConnection() ¶ public
setConnection(Cake\Database\Connection $connection): $this
设置连接实例。
参数
-
Cake\Database\Connection
$connection 连接实例
返回
$this
setDisplayField() ¶ public
setDisplayField(list<string>|string $field): $this
设置显示字段。
参数
-
list<string>|string
$field 用作显示字段的名称。
返回
$this
setEntityClass() ¶ public
setEntityClass(string $name): $this
设置用于为该表填充行的类。
参数
-
string
$name 要使用的类的名称
返回
$this
抛出
Cake\ORM\Exception\MissingEntityException
当找不到实体类时
setEventManager() ¶ public
setEventManager(Cake\Event\EventManagerInterface $eventManager): $this
返回该对象的 Cake\Event\EventManagerInterface 实例。
您可以使用此实例向对象事件注册任何新的监听器或回调,或者创建您自己的事件并随意触发它们。
参数
-
Cake\Event\EventManagerInterface
$eventManager 要设置的事件管理器
返回
$this
setPrimaryKey() ¶ public
setPrimaryKey(list<string>|string $key): $this
设置主键字段名称。
参数
-
list<string>|string
$key 设置一个新的名称作为主键
返回
$this
setRegistryAlias() ¶ public
setRegistryAlias(string $registryAlias): $this
设置用于创建该表实例的表注册表键。
参数
-
string
$registryAlias 用于访问此对象的键。
返回
$this
setSchema() ¶ public
setSchema(Cake\Database\Schema\TableSchemaInterface|array $schema): $this
设置描述该表属性的模式表对象。
如果传递了一个数组,则将使用它构造一个新的 TableSchemaInterface 并用作此表的模式。
参数
-
Cake\Database\Schema\TableSchemaInterface|array
$schema 要用于此表的模式
返回
$this
setTable() ¶ public
setTable(string $table): $this
设置数据库表名。
这可以包括数据库模式名称,形式为“schema.table”。如果名称必须被引用,请启用自动标识符引用。
参数
-
string
$table 表名。
返回
$this
setValidator() ¶ public
setValidator(string $name, Cake\Validation\Validator $validator): $this
此方法在给定名称下存储自定义验证器。
您可以自己构建对象并将其存储在您的对象中
$validator = new \Cake\Validation\Validator();
$validator
->add('email', 'valid-email', ['rule' => 'email'])
->add('password', 'valid', ['rule' => 'notBlank'])
->allowEmpty('bio');
$this->setValidator('forSubscription', $validator);
参数
-
string
$name 要设置的验证器的名称。
-
Cake\Validation\Validator
$validator 要设置的验证器对象。
返回
$this
subquery() ¶ public
subquery(): Cake\ORM\Query\SelectQuery
创建一个新的 Query 实例,其中禁用字段自动别名。
这对于子查询很有用。
返回
Cake\ORM\Query\SelectQuery
updateAll() ¶ public
updateAll(Cake\Database\Expression\QueryExpressionClosure|array|string $fields, Cake\Database\Expression\QueryExpressionClosure|array|string|null $conditions): int
更新所有匹配的记录。
根据 $conditions
将 $fields
设置为提供的值。此方法不会触发 beforeSave/afterSave 事件。如果需要这些事件,请先加载一个记录集合并更新它们。
参数
-
Cake\Database\Expression\QueryExpressionClosure|array|string
$fields 字段 => 新值的哈希。
-
Cake\Database\Expression\QueryExpressionClosure|array|string|null
$conditions 要使用的条件,接受 Query::where() 中的任何内容。
返回
int
updateQuery() ¶ public
updateQuery(): Cake\ORM\Query\UpdateQuery
创建一个新的更新查询
返回
Cake\ORM\Query\UpdateQuery
validateUnique() ¶ public
validateUnique(mixed $value, array<string, mixed> $options, array|null $context = null): bool
验证器方法,用于检查列中值的唯一性。这旨在与验证 API 一起使用,而不是直接调用。
示例
$validator->add('email', [
'unique' => ['rule' => 'validateUnique', 'provider' => 'table']
])
唯一性验证可以限定为另一个列的值
$validator->add('email', [
'unique' => [
'rule' => ['validateUnique', ['scope' => 'site_id']],
'provider' => 'table'
]
]);
在上面的示例中,电子邮件唯一性将限定为仅具有相同 site_id 的行。仅当限定字段存在于要验证的数据中时,才会使用限定。
参数
-
mixed
$value 要检查唯一性的列的值。
-
array<string, mixed>
$options 选项数组,可选地包含“scope”键。也可能是验证上下文,如果没有选项。
-
array|null
$context optional 验证上下文或 null。
返回
bool
validationDefault() ¶ public
validationDefault(Cake\Validation\Validator $validator): Cake\Validation\Validator
返回默认验证器对象。子类可以覆盖此函数以在验证器对象中添加默认验证集。
参数
-
Cake\Validation\Validator
$validator 可以修改以向其添加一些规则的验证器。
返回
Cake\Validation\Validator
validationMethodExists() ¶ protected
validationMethodExists(string $name): bool
检查验证方法是否存在。
参数
-
string
$name
返回
bool
属性详情
$_eventManager ¶ 受保护的
此对象用于分发内部事件的 Cake\Event\EventManager 实例。
类型
Cake\Event\EventManagerInterface|null