我正在开发一个CakePHP应用程序,我想使用UUID作为主键,因为应用程序将分布在多个数据库中,我还想利用CakePHP 2.1中的集成ACL框架
我按照the tutorial进行操作,并将DB方案修改为以下
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。
有没有人成功地将CakePHP ACL框架与UUID一起使用?我希望在CakePHP框架中进行最少的修改,以便将来支持此应用程序。
答案 0 :(得分:1)
没有为data type UUID
定义聚合函数max()
。没有UUID
被视为“更大”而不是另一个UUID
。
考虑以下演示:
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。