Добавление идентификатора и типа из дополнительных таблиц в родительскую таблицу с использованием SQL (полиморфные отношения MySQL и Laravel)
Заметка. Также размещено в базе данных администраторов
У меня есть одна таблица, в которой записываются все продажи, и четырнадцать дополнительных таблиц, которые содержат дополнительную информацию о продаже. Четырнадцать дополнительных таблиц для всех целей и целей одинаковы. Они были созданы давно, когда первоначальный разработчик думал, что будет больше различий, но на самом деле теперь, когда проект созрел, они больше похожи, чем отличаются. Однако они разные, и поэтому я должен держать их отдельно.
Текущая структура
Таблица продаж
| id | customer_id | customer_ref | ... |
|---------|-------------|--------------------------------------|-----|
| 1237567 | 354 | a6143f8c-b679-47be-9bc0-52457842913c | ... |
| 1237568 | 867 | ref89b72 | ... |
| ... | ... | ... | ... |
Дополнительный стол 1 Класс: App \ SuppOne
| id | customer_id | customer_ref | ... |
|------|-------------|--------------------------------------|-----|
| 2857 | 10372 | 2016-07-01-ab5d09cc37ca | ... |
| 2858 | 354 | a6143f8c-b679-47be-9bc0-52457842913c | ... |
| ... | ... | ... | ... |
Дополнительный стол 2 Класс: App \ SuppTwo
| id | customer_id | customer_ref | ... |
|-------|-------------|--------------|-----|
| 90488 | 867 | ref89b72 | ... |
| 90489 | 1024 | 0000080992 | ... |
| ... | ... | ... | ... |
В таблицах нет внешних ключей для присоединения таблицы продаж к дополнительным таблицам, но есть 'customer_id' и 'customer_reference', которые являются уникальными как для таблиц продаж, так и для дополнительных таблиц, но они не согласованы. Это то, что в настоящее время используется, чтобы присоединиться к двум по мере необходимости мне нужно, чтобы получить больше информации о данной продаже.
Я использую Laravel 5.1 и базу данных MySQL, и я хотел бы добавить два поля в таблицу продаж; extramental_id и extramental_type для быстрого и эффективного создания полиморфных отношений.
Желаемая структура
Таблица продаж
| id | supplemental_id | supplemental_type | customer_id | customer_ref | ... |
|---------|-----------------|-------------------|-------------|--------------------------------------|-----|
| 1237567 | 2858 | App\SuppOne | 354 | a6143f8c-b679-47be-9bc0-52457842913c | ... |
| 1237568 | 90488 | App\SuppTwo | 867 | ref89b72 | ... |
| ... | ... | ... | ... | ... | ... |
Мне нужно добавить эти два поля в каждую из записей о продажах, но я не уверен, как это сделать с помощью необработанного SQL, так как я ожидаю, что это будет гораздо быстрее, чем в случае миграции. Я хотел бы знать, как (если это возможно) в SQL, я имею дело с отображением из table_name в App\ClassName. В таблице продаж содержится около 1,5 млн записей, и их повторение не займет незначительного времени.
1 ответ
Что -то между строк.
Он может потенциально переопределять данные для конкретной записи продажи (т.е. SuppFourteen переопределяет данные SuppOne), но именно так вы представили их в своем вопросе.
$fourteen_tables = [
'supplemental_table_1' => App\SuppOne::class,
// ...
];
foreach ($fourteen_tables as $table => $class) {
DB::table('sales_table')
->join($table, function ($join) use ($table) {
$join->on($table.'.customer_id', '=', 'sales_table.customer_id')
->on($table.'.customer_ref', '=', 'sales_table.customer_ref');
})
->update([
'sales_table.supplemental_id' => DB::raw($table.'.id'),
'sales_table.supplemental_type' => $class,
]);
}