cuppett/cakephp-pg_utils

该包已被 弃用 并不再维护。未建议替代包。

CakePHP PostgreSQL 工具

1.0.1 2015-02-01 17:08 UTC

This package is auto-updated.

Last update: 2020-08-19 00:08:27 UTC


README

PgUtils 提供了一组对工作于 Postgres 数据源有用的行为。

要求

主分支有如下要求

  • CakePHP 2.2.0 或更高版本。
  • PHP 5.3.0 或更高版本。

功能

  • 搜索行为 - 在模型上执行文本搜索。允许执行复杂的全文搜索。还包括简化的查询解析器。
  • JSON 行为 - 获取和存储 JSON 数据类型。在检索时将值展开为关联数组,在保存时将数组折叠回值。
  • 数组行为 - 获取和存储数组数据类型。在检索时将值展开为数组,在保存时将数组折叠回值。
  • 间隔行为 - 获取和存储间隔数据类型。PHP 间隔转换为 ISO8601 格式并存储到特殊 PostgreSQL 数据类型列中。

安装

  • 将此目录中的文件克隆/复制到 app/Plugin/PgUtils
  • 确保在 app/Config/bootstrap.php 中通过调用 CakePlugin::load('PgUtils'); 加载插件
  • 要使用 IntervalBehavior,您必须确保通过数据库连接使用 iso8601 存储和检索值。
	public $default = array(
		'datasource' => 'Database/Postgres',
		'persistent' => false,
		'host' => 'localhost',
		'login' => 'user',
		'password' => 'password',
		'database' => 'database_name',
		'prefix' => '',
		'encoding' => 'utf8',
		'settings' => array(
			'intervalstyle' => 'iso_8601'
		)		
	);
  • 全文搜索需要创建和维护一个 ts_vector 列。最简单的方法是使用触发器。

使用 Composer

确保在 composer.json 中存在 require。这将安装插件到 Plugin/AwsUtils

{
    "require": {
        "cuppett/cakephp-pg_utils": "1.0.*"
    },
    "extra":
	{
	    "installer-paths":
	    {
	        "app/Plugin/PgUtils": ["cuppett/cakephp-pg_utils"]
	    }
	}       
}

示例

在模型中使用间隔/JSON/数组类型

如果您的数据库表在其定义中包含间隔、JSON 或数组类型,您可以通过 afterFind 和 beforeSave 回调配置行为,以帮助将它们转换为更符合 PHP 的类型和值。

它们通过在模型中识别要转换的字段进行配置。一个潜在的提升是将这些字段自动检测出来;然而,可能也有必要不自动将所有内容转换为这些类型。

class Task extends AppModel {
    public $actsAs = array(
        'PgUtils.Interval' => array(
            'fields' => array(
                'estimate',
                'actual',
                'remain'
            )
        ),
        'PgUtils.Json' => array('fields' => array('custom_attributes'))
    );

将搜索列集成到您的数据库中。

搜索行为需要定义一个 ts_vector 列。该列必须与行为分开维护。以下是一个示例 SQL 脚本,用于在数据库更新时添加和更新该列

CREATE TABLE primary_objects (
  id UUID NOT NULL default uuid_generate_v4(),
  "name" varchar(255) not null,
  description text,
  created timestamp with time zone not null default CURRENT_TIMESTAMP,
  modified timestamp with time zone not null default CURRENT_TIMESTAMP,
  searchable_text tsvector
);

CREATE OR REPLACE FUNCTION updateVector() RETURNS trigger AS $$
BEGIN
	NEW.searchable_text = 
		setweight(to_tsvector('pg_catalog.english', coalesce(NEW."name", '')), 'A') ||
		setweight(to_tsvector('pg_catalog.english', coalesce(NEW.description, '')), 'D');

	RETURN NEW;	
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER indexObjects
	BEFORE INSERT OR UPDATE OF "name", description ON primary_objects
	FOR EACH ROW
	EXECUTE PROCEDURE updateVector();

您可以向搜索添加其他列和权重;您可以在表/列上添加 gist 或 gin 索引以加快结果;等等。

从您的应用程序中使用搜索

在您的模型类中

$this->Behaviors->load(
    'PgUtils.Search', array(
        'column' => 'searchable_text',
        'weights' => array(
            'name' => 'A',
            'description' => 'D'
        )
    )
);

来自您的控制器

$results = $this->PrimaryObject->search($this->request->data['Search']['query'],
    array(
        'limit' => 25,
        'headline' => array('name', 'description'),
        'fields' => array('id', 'name', 'description', 'modified')
     )
);

然后您可以在视图中像平常一样显示结果。

可能包含的搜索包括自由文本,如“猫和狗”、“猫或狗”等。当前的运算符包括“和”、“或”,以及“-”用于排除某些术语。

您也可以在术语前加上字段名,例如“name:cat”。从上面的设置示例中,这将改变查询,以便仅搜索“A”类别中的“cat”术语。

请参阅PostgreSQL文档中的主题控制文本搜索以获取更多关于这些主题的信息。我已经尝试展示我最常用的控件,但我也欢迎其他建议。

报告问题

如果您在PgUtils中遇到问题,请在GitHub上创建一个问题。