CakePHP ACL с первичными ключами UUID - PullRequest
2 голосов
/ 03 февраля 2012

Я занимаюсь разработкой приложения CakePHP и хотел бы использовать UUID в качестве первичных ключей, поскольку приложение будет распределено по нескольким базам данных, а также я хотел бы воспользоваться преимуществами интегрированной инфраструктуры ACL в CakePHP 2.1

.

Я иду согласно учебному пособию , и я изменил схему БД следующим образом

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: ВЫБРАТЬ МАКС ("Aro". "Rght") AS "rght" ОТ "public". "Aros" AS "... ^СОВЕТ: ни одна функция не соответствует заданному имени и типу аргумента. Возможно, вам понадобится добавить явное приведение типов.

Версия CakePHP - 2.1.0-бета, и я использую PostgreSQL с типом данных UUID.

Кто-нибудь успешно использовал платформу ACL CakePHP с UUID? Я хотел бы, чтобы это работало с минимальными изменениями в платформе CakePHP для будущей поддержки этого приложения.

1 Ответ

1 голос
/ 03 февраля 2012

Агрегирующая функция max() не определена для типа данных UUID. Нет 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 может быть представлен во многих других формах.

...