ravage84/cakephp-multi-column-uniqueness

一个用于验证组合唯一索引的 CakePHP 插件

0.4.0 2017-02-21 15:12 UTC

This package is auto-updated.

Last update: 2024-09-12 03:38:38 UTC


README

Travis-CI Build Status Coverage Status Scrutinizer Code Quality Total Downloads Latest Stable Version

这是一个 CakePHP 2.x 行为插件,用于验证模型多个字段的唯一性。

要求

该插件已经与以下配置进行过测试

  • CakePHP 2.4.1 - 2.5.4
  • PHP 5.4.7
  • MySQL

但它应该可以与以下兼容

  • CakePHP 2.4.1 或更高版本。
  • PHP 5.2.8 或更高版本。
  • 其他数据源

安装

  • 将此目录中的文件克隆/复制到 app/Plugin/MultiColumnUniqueness
  • 确保通过调用 CakePlugin::load('MultiColumnUniqueness');CakePlugin::loadAll();app/Config/bootstrap.php 中加载插件

使用 Composer

请参阅 CakePHP 书籍中的插件安装指南

报告问题

如果您对这个插件有任何问题,请提交问题。但在提交之前,请检查问题是否已经被报告

贡献

如果您想为此项目做出贡献,请查看开放问题,了解任何计划中的功能或开放的错误。您可以复制项目,添加功能、文档,并发送拉取请求;或者提交问题

版本控制

此插件遵循SemVer(语义版本控制)。由于 API 仍在开发中,插件尚未达到 1.0 版本。

CakePHP 版本支持

没有计划将其回溯到 CakePHP 1.x。插件应更新以支持未来的 2.x 版本。对于 CakePHP 3.0,可能需要进行完全重写...

如何使用

假设您有一个名为 Product 的模型,该模型有多个字段,但其中两个字段需要相互关联地保持唯一。这些字段是 namemanufacturer_id

正如您所知,您可以使用 CakePHP 内置的数据验证规则 isUnique。此规则甚至可以接受多个列,您可以像这样实现

public $validate = array(
	'first_name' => array(
		'unique_first_last' => array(
			'rule'    => array('checkMultiColumnUnique', array('first_name', 'last_name'), false)
			'message' => 'The first and last name must be unique.'
		)
	),
	// Additionally/optionally the same for the 'last_name' field
;)


public function checkMultiColumnUnique($ignoredData, $fields, $or = true) {
		return $this->isUnique($fields, $or);
}

那么为什么还要使用这个插件呢?因为上面的解决方案有一些缺点。首先,您必须为所有需要唯一性的字段设置相同的规则,或者只设置其中一个字段的规则。

如果您为所有字段设置规则,则规则将针对每个字段执行,导致多个(且冗余)SQL 查询。如果您只为一个字段设置规则,那么您必须每次保存需要唯一性的字段时都要将该字段包含在数据数组中。此插件通过动态添加规则来避免这些问题。

要为这些字段启用 MultiColumnUniquenessBehavior,您需要设置 Product 模型的 $actsAs 属性。

public $actsAs = array('MultiColumnUniqueness.MultiColumnUniqueness' => array(
	'fields' => array('name', 'manufacturer_id')
));

这是最简单的设置形式。当验证失败时,它会输出一个 字段 mane 和 manufacturer_id 必须是唯一的。 错误消息。

此外,您还可以选择一个自定义验证错误消息,如下所示

public $actsAs = array('MultiColumnUniqueness.MultiColumnUniqueness' => array(
	'fields' => array('name', 'manufacturer_id'),
	'errMsg' => "This name and manufacturer ID can't be used twice."
));

现在假设您还有三个其他字段,分别命名为 field1field2field13,它们需要在同一模型中与其他字段联合唯一。如果您不需要自定义错误消息,可以设置如下

public $actsAs = array('MultiColumnUniqueness.MultiColumnUniqueness' => array(
	'fields' => array(
		array('name', 'manufacturer_id'),
		array('field1', 'field2', 'field3'),
	)
));

对于相同的情况但带有自定义错误消息,可以这样做

public $actsAs = array('MultiColumnUniqueness.MultiColumnUniqueness' => array(
	'fields' => array(
		array('name', 'manufacturer_id'),
		array('field1', 'field2', 'field3'),
	),
	'errMsg' => array(
		"This name and manufacturer ID can't be used twice.",
		"This field1, field2, fiel3 can't be used twice"),
));

默认情况下,数据验证规则将只添加到数据数组中找到的第一个需要唯一的字段。如果您想对每个唯一字段强制进行数据验证,请将 onlyOnce 选项设置为 false。这样,验证错误消息将显示在每个唯一字段上。

public $actsAs = array('MultiColumnUniqueness.MultiColumnUniqueness' => array(
	'fields' => array(
		array('name', 'manufacturer_id'),
		array('field1', 'field2', 'field3'),
	),
	'onlyOnce' => false,
));

此选项只能按模型设置,而不是按唯一字段组设置。

待办事项

背景故事

我需要验证模型中两个字段的唯一性。不是分别验证,因为 CakePHP 支持内置的 isUnique 数据验证规则,而是在相互关联的情况下。在我没有找到任何内置解决方案之后,我转向 Google 并找到了一些关于这篇文章的资料我还询问了 dereuromark 是否知道是否存在现有解决方案。他向我指出了他在 Tools 项目 中名为 MyModel 的扩展模型

这些解决方案似乎有效,但它们中的每一个要么不是最新的,要么在方法上不够简洁,要么让我为了满足我狭窄的需求而添加了过多的代码。因此,我决定为它编写一个行为(顺便提一下,这是我写的第一个)。

在我让它工作后,我认为其他人也可以从中受益,所以我创建了此项目并将其实现为一个插件。