2012-02-02 76 views
2

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

我根据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错误:好玩ction max(uuid)不存在LINE 1:SELECT MAX(“Aro”。“rght”)AS“rght”FROM“public”。“aros”AS“... ^提示:没有函数匹配给定的名称和参数类型。您可能需要添加显式类型转换。

CakePHP的版本是2.1.0-beta,我使用PostgreSQL和UUID数据类型。

有没有人成功使用CakePHP ACL框架与UUID?我希望通过CakePHP框架中的最小修改来实现此功能,以便将来支持此应用程序。

回答

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可以用许多其他形式表示。

+0

嗯,我知道,为什么它失败了,但我在CakePHP ACL框架中寻找最简单的方法,所以我不必创建自己的“排序ACL框架”。但是,将类型改为“字符(36)”会使代码无误地出现,尽管现在的问题是,如果它仍然在运行,那么你是对的。 – Marek 2012-02-03 06:51:13

+0

@Marek我不会改变数据类型。问题是,为什么你需要最大的UUID?如果这样做,只能将值计算为计算值。你也可以编写自己的聚合函数'max(uuid)'。 – 2012-02-03 16:46:00