注意。 Also posted on Database Administrators

我有一个表记录所有销售情况,还有十四个补充表,其中包含有关销售的额外信息。十四个补充表在所有意图和目的上都是相同的。它们创建于很久以前,当时最初的开发人员认为会有更多差异,但是实际上,由于该项目已经成熟,所以它们之间的相似性大于差异。但是它们是不同的,因此我需要将它们分开。

目前的结构

销售表

| 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数据库,我想在sales表中添加两个字段; Supplemental_id和Supplemental_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的映射。销售表中大约有150万条记录,遍历所有这些记录不会花费很短的时间。

最佳答案

界线之间的东西。

它可以潜在地覆盖特定销售记录的数据(即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,
        ]);
}

关于mysql - 使用SQL将补充表的ID和类型添加到父表中(MySQL和Laravel多态关系),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51776685/

10-11 09:07