Я бы хотел использовать Laravel Eloquent Polymorphic Relationships, однако, похоже, он не настроен для работы со структурой моей таблицы.
По сути, у меня есть таблица игровых данных, которая включает в себя все различные типы игровых данных (нация, лига, команда, игрок и т. Д.). Для каждого типа у меня есть несколько таблиц с информацией, разделенной game_id. Таким образом, в таблице игровых данных будет одна строка для нации "Англия", которая имеет 7 соответствующих строк в таблице наций с данными из 7 различных game_ids.
Я бы хотел иметь возможность выбирать некоторые строки из таблицы игровых данных и соответствующие им строки из соответствующей таблицы в зависимости от ее типа.
Это достаточно легко сделать в отношениях один к одному, но кажется невозможным в отношениях один ко многим.
Вот таблица игровых данных.
CREATE TABLE `gamedata` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`data_type` varchar(16) COLLATE utf8mb4_unicode_ci NOT NULL,
`name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `data_id` (`data_id`,`type`),
FULLTEXT KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
А затем множество таких таблиц (для удобства чтения убрано множество столбцов):
CREATE TABLE `nations` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`game_id` tinyint(3) unsigned NOT NULL,
`gamedata_id` int(10) unsigned NOT NULL,
`name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`short_name` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
/* more specific columns removed for ease of reading */
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `leagues` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`game_id` tinyint(3) unsigned NOT NULL,
`gamedata_id` int(10) unsigned NOT NULL,
`name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`short_name` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
/* more specific columns removed for ease of reading */
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `teams` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`game_id` tinyint(3) unsigned NOT NULL,
`gamedata_id` int(10) unsigned NOT NULL,
`name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`short_name` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
/* more specific columns removed for ease of reading */
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
Так что некоторые строки в таблице игровых данных могут выглядеть следующим образом:
(144, 'nation', 'Some Nation'),
(145, 'nation', 'Another Nation'),
(146, 'league', 'Some League'),
(147, 'league', 'Another League'),
(148, 'team', 'Some Team'),
(149, 'team', 'Another Team');
Так что я должен иметь возможность сделать полиморфные отношения из столбца «data_type» и «data_id», чтобы получить соответствующую строку из соответствующей таблицы.
Но ни одно из встроенных отношений (morphTo, morphMany, morphedByMany) и т. Д., Кажется, не в состоянии справиться с этим.
Похоже, что я хочу, это отношение morphTo()
, но оно ограничивается возвращением только одной связанной модели. Все отношения, которые принимают несколько моделей, требуют определения конкретной модели.
// This would work fine if I only wanted one related model. "data_type" being the class and "id" corresponding to "gamedata_id" on relevent table.
$this->morphTo('data');
// These require me to be explicit about the class instantiating rather than using from the "data_type" column
$this->morphMany(???, 'data');
$this->morphToMany(???, 'data');
$this->morphedByMany(???, 'data');
Есть ли способ сделать это, используя существующие отношения Laravel? Или есть простой способ создать собственный класс отношений на основе morphTo, который бы соответствовал моим потребностям?