cuppett / cakephp-pg_utils
该包已被 弃用 并不再维护。未建议替代包。
CakePHP PostgreSQL 工具
1.0.1
2015-02-01 17:08 UTC
Requires
- php: >=5.3.3
- composer/installers: *
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上创建一个问题。