Обработка разделенных таблиц в CakePHP - PullRequest
0 голосов
/ 05 апреля 2019

В моем приложении cakephp 3.7.5 у меня есть тестовая база данных, в которой одна из таблиц разделена следующим образом:

-- Table: public.impressions

-- DROP TABLE public.impressions;

CREATE TABLE public.impressions
(
    id bigint NOT NULL DEFAULT nextval('impressions_id_seq'::regclass),
    company_id bigint NOT NULL,
    ad_id bigint,
    seen_at timestamp without time zone NOT NULL,
    site_url text COLLATE pg_catalog."default" NOT NULL,
    cost_per_impression_usd numeric(20,10),
    user_ip inet NOT NULL,
    user_data jsonb,
    CONSTRAINT impressions_pkey PRIMARY KEY (id),
    CONSTRAINT impressions_company_id_fkey FOREIGN KEY (ad_id, company_id)
        REFERENCES public.ads (id, company_id) MATCH SIMPLE
        ON UPDATE NO ACTION
        ON DELETE NO ACTION
)
WITH (
    OIDS = FALSE
)
TABLESPACE pg_default;

ALTER TABLE public.impressions
    OWNER to postgres;

-- Rule: impressions_one ON public.impressions

-- DROP Rule impressions_one ON public.impressions;

CREATE OR REPLACE RULE impressions_one AS
    ON INSERT TO public.impressions
    WHERE new.company_id < 25
    DO INSTEAD
INSERT INTO impressions_one (id, company_id, ad_id, seen_at, site_url, cost_per_impression_usd, user_ip, user_data)
  VALUES (new.id, new.company_id, new.ad_id, new.seen_at, new.site_url, new.cost_per_impression_usd, new.user_ip, new.user_data);


-- Rule: impressions_three ON public.impressions

-- DROP Rule impressions_three ON public.impressions;

CREATE OR REPLACE RULE impressions_three AS
    ON INSERT TO public.impressions
    WHERE new.company_id >= 50
    DO INSTEAD
INSERT INTO impressions_three (id, company_id, ad_id, seen_at, site_url, cost_per_impression_usd, user_ip, user_data)
  VALUES (new.id, new.company_id, new.ad_id, new.seen_at, new.site_url, new.cost_per_impression_usd, new.user_ip, new.user_data);


-- Rule: impressions_two ON public.impressions

-- DROP Rule impressions_two ON public.impressions;

CREATE OR REPLACE RULE impressions_two AS
    ON INSERT TO public.impressions
    WHERE new.company_id >= 25 AND new.company_id < 50
    DO INSTEAD
INSERT INTO impressions_two (id, company_id, ad_id, seen_at, site_url, cost_per_impression_usd, user_ip, user_data)
  VALUES (new.id, new.company_id, new.ad_id, new.seen_at, new.site_url, new.cost_per_impression_usd, new.user_ip, new.user_data);

Все правила работают правильно, и значения правильно вставляются в их разделы, но только когда я выполняю команду INSERT INTO sql.

Проблема с моей секционированной таблицей и cakephp заключается в том, что cakephp, похоже, извлекает вставленную сущность, используя параметр RETURNING после sql INSERT

Это из отладки cakephp

ВСТАВЬТЕ в показы (company_id, seen_at, site_url, cost_per_impression_usd, user_ip, user_data) ЗНАЧЕНИЯ (: c0,: c1,: c2, : c3,: c4,: c5) ВОЗВРАЩЕНИЕ *

и, конечно же, когда я запускаю этот запрос в postgres, возникает то же исключение, что и cakephp

ОШИБКА: невозможно выполнить ВСТАВКУ ВЕРНУТЬСЯ в отношении «впечатлений» СОВЕТ: Вам нужно безусловное правило ON INSERT DO INSTEAD с ВОЗВРАЩЕНИЕ Состояние SQL: 0A000

проблема в том, что postgresql не допускает такого рода сценарий с возвратом данных, но это путь кайфпп. Я сделал это с Symfony, той же базы данных, и все работало нормально.

Является ли этот поведение CakePHP изменяемым или настраиваемым таким образом, что когда я сохраняю сущность, он пропускает возвращаемую опцию для вставки. что-то вроде:

$this->Impressions->save($impression,['skip_returning_stm'=>true]);

Мне нужна таблица, разбитая на разделы и фреймворк CakePHP, я пробовал только Symfony, чтобы отказаться от совместимости фреймворка.

Заранее спасибо !!!

...