Как в Laravel построить свободную таблицу с помощью PIVOT
Начну с примера: Вот есть всем известная программа Exel (классная штука), так вот в ней мы можем динамически создавать поля в котором есть свои значения так же есть сортировка поля и его фильтрация Коротко говоря таблица у которой не ограниченное количество полей, у каждого своё значение c фильтром и сортировкой.
Мой пример: у меня есть компании у которой есть свои 'Базы данных'; ВАЖНО ЗНАТЬ, в каждой компании есть сотрудники для которых некоторые КОЛОНКИ не должны показываться, так же есть вывод определённых записей для сотрудников!
CREATE TABLE `client_bases` (
`id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
`label` VARCHAR(255) NOT NULL COLLATE 'utf8_general_ci',
`key` VARCHAR(255) NOT NULL COLLATE 'utf8_general_ci',
`user_id` INT(10) UNSIGNED NOT NULL,
`count` INT(10) NOT NULL DEFAULT '0',
`position` INT(10) NOT NULL DEFAULT '0',
`created_at` TIMESTAMP NULL DEFAULT NULL,
`updated_at` TIMESTAMP NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `client_bases_key_unique` (`key`) USING BTREE,
INDEX `client_bases_id_index` (`id`) USING BTREE,
INDEX `client_bases_user_id_index` (`user_id`) USING BTREE,
) COLLATE='utf8_general_ci' ENGINE=InnoDB AUTO_INCREMENT=1;
INSERT INTO `client_bases` VALUES (1, 'База клиентов', 'baza-klientov-2', 1, 100, 0, '2020-12-03 11:09:04', '2021-03-03 17:12:00');
так же есть поля со связью ManyToMany к 'базах данных' то есть у Базы Клиентов есть похожие поля как у Базы Клиентов 1
CREATE TABLE `client_fields` (
`id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
`user_id` INT(10) UNSIGNED NOT NULL,
`label` VARCHAR(255) NOT NULL COLLATE 'utf8_general_ci',
`key` VARCHAR(255) NOT NULL COLLATE 'utf8_general_ci',
`values` TEXT NOT NULL COLLATE 'utf8_general_ci',
`type` ENUM('date','text','select','db','phone','textarea') NOT NULL COLLATE 'utf8_general_ci',
`created_at` TIMESTAMP NULL DEFAULT NULL,
`updated_at` TIMESTAMP NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `client_fields_key_unique` (`key`) USING BTREE,
INDEX `client_fields_id_index` (`id`) USING BTREE,
INDEX `client_fields_user_id_index` (`user_id`) USING BTREE,
) COLLATE='utf8_general_ci' ENGINE=InnoDB AUTO_INCREMENT=1;
INSERT INTO `client_fields` VALUES (1, 1, 'Статус', 'status', 'statuses', 'db', NULL, NULL);
INSERT INTO `client_fields` VALUES (2, 1, 'ФИО', 'fio', '', 'text', NULL, '2020-12-07 14:03:53');
INSERT INTO `client_fields` VALUES (3, 1, 'Область', 'region', 'city', 'db', NULL, NULL);
INSERT INTO `client_fields` VALUES (4, 1, 'Город', 'city', 'city', 'db', NULL, NULL);
INSERT INTO `client_fields` VALUES (5, 1, 'Бюджет', 'budget', '', '', NULL, NULL);
INSERT INTO `client_fields` VALUES (6, 1, 'Дата создания', 'date', '', 'date', NULL, NULL);
INSERT INTO `client_fields` VALUES (7, 1, 'Ответственный', 'responsible', 'users', 'db', NULL, '2020-04-23 18:29:22');
INSERT INTO `client_fields` VALUES (8, 1, 'Автор', 'author', 'users', 'db', NULL, NULL);
INSERT INTO `client_fields` VALUES (9, 1, 'Покупатель', 'buyer', '', 'text', NULL, NULL);
INSERT INTO `client_fields` VALUES (10, 1, 'Телефон', 'phone', '', 'phone', NULL, NULL);
CREATE TABLE `client_base_field` (
`id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
`base_id` BIGINT(20) UNSIGNED NOT NULL,
`field_id` BIGINT(20) UNSIGNED NOT NULL,
`position` INT(10) NOT NULL DEFAULT '0',
`required` INT(10) NOT NULL DEFAULT '0',
`created_at` TIMESTAMP NULL DEFAULT NULL,
`updated_at` TIMESTAMP NULL DEFAULT NULL,
`in_unique` TINYINT(1) NOT NULL DEFAULT '0',
`filter_show_all` TINYINT(1) NOT NULL DEFAULT '0',
`in_requests` TINYINT(1) NOT NULL DEFAULT '0',
`in_orders` TINYINT(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`) USING BTREE,
INDEX `client_base_field_id_index` (`id`) USING BTREE,
INDEX `client_base_field_base_id_index` (`base_id`) USING BTREE,
INDEX `client_base_field_field_id_index` (`field_id`) USING BTREE,
CONSTRAINT `client_base_field_base_id_foreign` FOREIGN KEY (`base_id`) REFERENCES `client_bases` (`id`) ON UPDATE NO ACTION ON DELETE CASCADE,
CONSTRAINT `client_base_field_field_id_foreign` FOREIGN KEY (`field_id`) REFERENCES `client_fields` (`id`) ON UPDATE NO ACTION ON DELETE CASCADE) COLLATE='utf8_general_ci' ENGINE=InnoDB AUTO_INCREMENT=1;
INSERT INTO `client_base_field` VALUES (1, 7, 1, 10, 0, '2020-12-09 11:59:21', '2021-02-16 14:17:41', 0, 1, 0, 0);
INSERT INTO `client_base_field` VALUES (1, 7, 2, 10, 0, '2020-12-09 11:59:21', '2021-02-16 14:17:41', 0, 1, 0, 0);
INSERT INTO `client_base_field` VALUES (1, 7, 3, 10, 0, '2020-12-09 11:59:21', '2021-02-16 14:17:41', 0, 1, 0, 0);
INSERT INTO `client_base_field` VALUES (1, 7, 4, 10, 0, '2020-12-09 11:59:21', '2021-02-16 14:17:41', 0, 1, 0, 0);
INSERT INTO `client_base_field` VALUES (1, 7, 5, 10, 0, '2020-12-09 11:59:21', '2021-02-16 14:17:41', 0, 1, 0, 0);
INSERT INTO `client_base_field` VALUES (1, 7, 6, 10, 0, '2020-12-09 11:59:21', '2021-02-16 14:17:41', 0, 1, 0, 0);
INSERT INTO `client_base_field` VALUES (1, 7, 7, 10, 0, '2020-12-09 11:59:21', '2021-02-16 14:17:41', 0, 1, 0, 0);
INSERT INTO `client_base_field` VALUES (1, 7, 8, 10, 0, '2020-12-09 11:59:21', '2021-02-16 14:17:41', 0, 1, 0, 0);
INSERT INTO `client_base_field` VALUES (1, 7, 9, 10, 0, '2020-12-09 11:59:21', '2021-02-16 14:17:41', 0, 1, 0, 0);
INSERT INTO `client_base_field` VALUES (1, 7, 10, 10, 0, '2020-12-09 11:59:21', '2021-02-16 14:17:41', 0, 1, 0, 0);
Дальше карточка клиента в которой хранится id 'базы данных'
CREATE TABLE `client_items` (
`id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
`base_id` BIGINT(20) UNSIGNED NOT NULL,
`created_at` TIMESTAMP NULL DEFAULT NULL,
`updated_at` TIMESTAMP NULL DEFAULT NULL,
`other` TINYINT(1) NOT NULL DEFAULT '0',
`unique` VARCHAR(255) NOT NULL DEFAULT '' COLLATE 'utf8_general_ci',
`author_id` BIGINT(19) NULL DEFAULT NULL,
`responsible_id` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8_general_ci',
`status` BIGINT(19) NULL DEFAULT NULL,
`date` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8_general_ci',
`old_status` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8_general_ci',
PRIMARY KEY (`id`) USING BTREE,
INDEX `client_items_id_index` (`id`) USING BTREE,
INDEX `client_items_base_id_index` (`base_id`) USING BTREE,
INDEX `base_id` (`base_id`) USING BTREE,
INDEX `date` (`date`) USING BTREE,
INDEX `status` (`status`) USING BTREE,
INDEX `responsible_id` (`responsible_id`) USING BTREE,
INDEX `author_id` (`author_id`) USING BTREE,
INDEX `unique` (`unique`) USING BTREE,
CONSTRAINT `client_items_base_id_foreign` FOREIGN KEY (`base_id`) REFERENCES `client_bases` (`id`) ON UPDATE NO ACTION ON DELETE CASCADE) COLLATE='utf8_general_ci'ENGINE=InnoDB
INSERT INTO `client_items` VALUES (1, 7, '2020-12-16 12:25:40', '2021-03-03 14:03:07', 0, '1033275976', 1, '1', 2, '2020-03-30', NULL);
И есть значения полей и данного клиента
CREATE TABLE `client_items_values` (
`id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
`item_id` BIGINT(20) UNSIGNED NOT NULL,
`field_key` VARCHAR(255) NOT NULL COLLATE 'utf8_general_ci',
`field_id` BIGINT(20) UNSIGNED NOT NULL,
`value` TEXT NOT NULL COLLATE 'utf8_general_ci',
`created_at` TIMESTAMP NULL DEFAULT NULL,
`updated_at` TIMESTAMP NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE,
INDEX `client_items_values_id_index` (`id`) USING BTREE,
INDEX `client_items_values_item_id_index` (`item_id`) USING BTREE,
INDEX `client_items_values_field_key_index` (`field_key`) USING BTREE,
INDEX `client_items_values_field_id_index` (`field_id`) USING BTREE,
INDEX `item_id` (`item_id`) USING BTREE,
INDEX `field_key` (`field_key`) USING BTREE,
INDEX `field_id` (`field_id`) USING BTREE,
CONSTRAINT `client_items_values_field_id_foreign` FOREIGN KEY (`field_id`) REFERENCES `client_fields` (`id`) ON UPDATE NO ACTION ON DELETE CASCADE,
CONSTRAINT `client_items_values_item_id_foreign` FOREIGN KEY (`item_id`) REFERENCES `client_items` (`id`) ON UPDATE NO ACTION ON DELETE CASCADE) COLLATE='utf8_general_ci' ENGINE=InnoDB AUTO_INCREMENT=1;
INSERT INTO `client_items_values` VALUES (1, 1, 'status', 1, '2', '2020-12-16 12:25:40', '2020-12-16 12:25:40');
INSERT INTO `client_items_values` VALUES (2, 1, 'fio', 2, 'Александр; Александр, '2020-03-30', '2020-12-16 12:25:40', '2020-12-16 12:25:40');
INSERT INTO `client_items_values` VALUES (3, 1, 'region', 3, Волынская область, '15329', '2020-12-16 12:25:40', '2020-12-16 12:25:40');
INSERT INTO `client_items_values` VALUES (4, 1, 'city', 4, 'Ратне', '2020-12-16 12:25:40', '2020-12-16 12:25:40');
INSERT INTO `client_items_values` VALUES (5, 1, 'budget', 5, 1000, '2020-12-16 12:25:40', '2020-12-16 12:25:40');
INSERT INTO `client_items_values` VALUES (6, 1, 'date', 6, '2020-12-16', '+380987629586', '2020-12-16 12:25:40', '2020-12-16 12:25:40');
INSERT INTO `client_items_values` VALUES (7, 1, 'responsible', 7, 'Волынская область', '2020-12-16 12:25:40', '2020-12-16 12:25:40');
INSERT INTO `client_items_values` VALUES (8, 1, 'author', 8, 'Ратне', '2020-12-16 12:25:40', '2020-12-16 12:25:40');
INSERT INTO `client_items_values` VALUES (9, 1, 'phone', 9, '911', '2020-12-16 12:25:40', '2020-12-16 12:25:40');
INSERT INTO `client_items_values` VALUES (10, 1, 'buyer', 10, 'Test', '2020-12-16 12:25:40', '2020-12-16 12:25:40');
вот ссылка для что б не копировать текст
И так какой результат мне нужен:
| id | Статус | ФИО | Область | Город | Бюджет | Дата создания | Ответственный | Автор | Телефон | Покупатель |
|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 2 | А.A.ле | Вол обл. | Ратне | 1000 | 2020-12-16 | 1 | 1 | 911 | Test |
- Возможно такое реализовать через модели и их отношения(pivot) в Laravel?
- Возможно ли в такой системе фильтровать и сортировать?
- И как такое вообще построить?
PS. Akina тебе большой привет, ты уже предложил свой вариант, если есть вариант и для laravel и с связью с полями к 'базе данных'