2012-02-02 15 views
2

私はCakePHPアプリケーションを開発しています。アプリケーションは複数のデータベースに分散されるので、UUIDをプライマリキーとして使用したいと思います。また、統合ACLフレームワークCakePHP ACL(UUIDプライマリキー付き)

CakePHPの2.1に私はthe tutorialに応じつもりですし、私は今、私はエラーを取得していますが

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) 
); 

を以下にDBスキーマを変更した:

エラー:SQLSTATE [42883]:未定義の関数: 7エラー:楽しいction max(uuid)は存在しませんLINE 1:SELECT MAX( "Aro"。 "rght")AS "rght" FROM "public"。 "aros" AS "... ^ヒント:指定された名前と引数に一致する関数はありませんタイプ。明示的な型キャストを追加する必要があるかもしれません。

CakePHPのバージョンは2.1.0-betaで、私はUUIDデータ型のPostgreSQLを使用しています。

誰かにUUIDのCakePHP ACLフレームワークを使用してもらえますか?私は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. 

あなたが問題を回避することができます

は、次のデモを考えてみましょう。

SELECT max(id::text) FROM t; 

収量:

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

しかし、それはちょうどUUIDの標準テキスト表現であることに注意してくださいあなたはアルファベット順に最大の価値をしたい場合は、テキストにidをキャストします。同じUUIDは他の多くの形式で表現できます。

+0

CakePHP ACLフレームワークで最も簡単な方法を探していますので、独自の「ACLフレームワークの種類」を作成する必要はありません。しかし、タイプを「文字(36)」に変更すると、コードは間違いなくなりますが、問題はまだ機能していれば問題になります。 – Marek

+0

@Marek私はデータ型を変更しません。問題は、なぜUUIDを最大にする必要があるかということです。そうした場合は、計算のためだけに値をキャストします。あなた自身の集合関数 'max(uuid)'を書くこともできます。 –

関連する問題