Files
backend/migrations/Version20260213132759.php
T
2026-05-27 19:36:32 +03:00

115 lines
4.5 KiB
PHP

<?php
declare(strict_types=1);
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;
/**
* Auto-generated Migration: Please modify to your needs!
*/
final class Version20260213132759 extends AbstractMigration
{
public function getDescription(): string
{
return 'Create view_article and populate article table';
}
public function up(Schema $schema): void
{
// Создаем представление view_article, если его еще нет
$this->addSql('CREATE OR REPLACE VIEW public.view_article
AS WITH article_data AS (
SELECT el.id AS article_id,
TRIM(TRAILING \'-\'::text FROM el.code) AS group_code,
el.id,
el.name,
el.preview_picture,
f.subdir,
f.file_name,
el.active,
el.iblock_id,
el.iblock_section_id,
el.code,
el.preview_text,
el.detail_text,
el.timestamp_x,
vap_doctors.value AS doctors,
vap_services.value AS services
FROM b_iblock_element el
JOIN b_file f ON f.id = el.preview_picture
LEFT JOIN view_article_props vap_doctors ON el.id = vap_doctors.id AND vap_doctors.code = \'LINK_STAFF\'::text
LEFT JOIN view_article_props vap_services ON el.id = vap_services.id AND vap_services.code = \'LINK_SERVICES\'::text
WHERE el.iblock_id = ANY (ARRAY[69, 70, 71, 149, 179, 231])
), grouped_articles AS (
SELECT d.group_code,
COALESCE(max(d.id), NULL::integer) AS id,
COALESCE(NULLIF(TRIM(BOTH FROM max(d.name)), \'\'::text), NULL::text) AS name,
COALESCE(max(
CASE
WHEN d.preview_picture IS NOT NULL THEN concat_ws(\'/\'::text, COALESCE(\'/upload\'::text, \'\'::text), COALESCE(d.subdir, \'\'::text), COALESCE(d.file_name, \'\'::text))
ELSE NULL::text
END), NULL::text) AS preview_picture,
COALESCE(
CASE
WHEN max(
CASE
WHEN d.active = true THEN 1
ELSE 0
END) = 1 THEN true
ELSE false
END, NULL::boolean) AS active,
CASE
WHEN count(d.doctors) FILTER (WHERE d.doctors IS NOT NULL AND TRIM(BOTH FROM d.doctors) <> \'\'::text) > 0 THEN jsonb_agg(DISTINCT TRIM(BOTH FROM d.doctors)) FILTER (WHERE d.doctors IS NOT NULL AND TRIM(BOTH FROM d.doctors) <> \'\'::text)
ELSE NULL::jsonb
END AS doctors,
CASE
WHEN count(d.services) FILTER (WHERE d.services IS NOT NULL AND TRIM(BOTH FROM d.services) <> \'\'::text) > 0 THEN jsonb_agg(DISTINCT TRIM(BOTH FROM d.services)) FILTER (WHERE d.services IS NOT NULL AND TRIM(BOTH FROM d.services) <> \'\'::text)
ELSE NULL::jsonb
END AS services,
COALESCE(max(
CASE d.iblock_id
WHEN 69 THEN 91
WHEN 149 THEN 91
WHEN 179 THEN 91
WHEN 70 THEN 92
WHEN 71 THEN 93
WHEN 231 THEN 94
ELSE d.iblock_id
END), NULL::integer) AS region_id,
COALESCE(max(d.code), NULL::text) AS alias,
COALESCE(max(d.preview_text), NULL::text) AS anons,
COALESCE(max(d.detail_text), NULL::text) AS content,
COALESCE(max(d.timestamp_x), NULL::timestamp without time zone) AS update_at
FROM article_data d
GROUP BY d.group_code
)
SELECT ga.id,
ga.name,
ga.preview_picture,
ga.active,
ga.doctors,
ga.services,
ga.region_id,
ga.alias,
ga.anons,
ga.content,
ga.update_at
FROM grouped_articles ga
ORDER BY ga.id');
// Наполняем таблицу article данными из представления
$this->addSql('INSERT INTO article (id, name, preview_picture, active, doctors, services, region_id, alias, anons, content, update_at)
SELECT id, name, preview_picture, active, doctors, services, region_id, alias, anons, content, update_at
FROM view_article');
}
public function down(Schema $schema): void
{
$this->addSql('TRUNCATE TABLE article');
$this->addSql('DROP VIEW IF EXISTS public.view_article');
}
}