В моем приложении 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, чтобы отказаться от совместимости фреймворка.
Заранее спасибо !!!