3

我正在开发一个 CakePHP 应用程序,我想使用 UUID 作为主键,因为应用程序将分布在多个数据库中,我还想利用 CakePHP 2.1 中的集成 ACL 框架

我将按照教程进行,并且已将数据库方案修改为以下

CREATE TABLE acos (
  id uuid NOT NULL,
  parent_id uuid DEFAULT NULL,
  model VARCHAR(255) DEFAULT '',
  foreign_key uuid DEFAULT NULL,
  alias VARCHAR(255) DEFAULT '',
  lft uuid DEFAULT NULL,
  rght uuid DEFAULT NULL,
  PRIMARY KEY  (id)
);

CREATE TABLE aros_acos (
  id uuid NOT NULL,
  aro_id uuid NOT NULL,
  aco_id uuid NOT NULL,
  _create CHAR(2) NOT NULL DEFAULT 0,
  _read CHAR(2) NOT NULL DEFAULT 0,
  _update CHAR(2) NOT NULL DEFAULT 0,
  _delete CHAR(2) NOT NULL DEFAULT 0,
  PRIMARY KEY(id)
);

CREATE TABLE aros (
  id uuid NOT NULL,
  parent_id uuid DEFAULT NULL,
  model VARCHAR(255) DEFAULT '',
  foreign_key uuid DEFAULT NULL,
  alias VARCHAR(255) DEFAULT '',
  lft uuid DEFAULT NULL,
  rght uuid DEFAULT NULL,
  PRIMARY KEY  (id)
);

但是现在我收到一个错误:

错误:SQLSTATE[42883]:未定义函数:7 错误:函数 max(uuid) 不存在第 1 行:SELECT MAX("Aro"."rght") AS "rght" FROM "public"."aros" AS"。 .. ^ 提示:没有函数匹配给定的名称和参数类型。您可能需要添加显式类型转换。

CakePHP 的版本是 2.1.0-beta,我正在使用带有 UUID 数据类型的 PostgreSQL。

有没有人成功使用带有 UUID 的 CakePHP ACL 框架?我想在 CakePHP 框架中进行最少的修改,以便将来支持这个应用程序。

4

1 回答 1

1

没有为数据类型max()定义聚合函数。No被认为比另一个“更大” 。UUIDUUIDUUID

考虑以下演示:

CREATE TEMP TABLE t(id uuid);
INSERT INTO t VALUES
 ('a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11')
,('b0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11');

SELECT max(id) FROM t;

产量:

ERROR:  function max(uuid) does not exist
LINE 1: SELECT max(id) FROM t;
               ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.

你可以绕过这个问题。id如果您想要按字母顺序排列的最大值,请转换为文本:

SELECT max(id::text) FROM t;

产量:

b0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11

但请注意,这只是 UUID 的标准文本表示。相同的 UUID 可以用许多其他形式表示。

于 2012-02-02T23:53:21.833 回答