Добавление идентификатора и типа из дополнительных таблиц в родительскую таблицу с использованием 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,
        ]);
}
Другие вопросы по тегам