使用SQL(MySQL和Laravel多态关系)将补充表中的ID和类型添加到父表中

使用SQL(MySQL和Laravel多态关系)将补充表中的ID和类型添加到父表中,mysql,laravel-5,laravel-5.1,polymorphic-associations,Mysql,Laravel 5,Laravel 5.1,Polymorphic Associations,注意 我有一个记录所有销售的表和十四个包含销售额外信息的补充表。14个补充表的所有意图和目的均相同。它们是在很久以前创建的,当时最初的开发人员认为会有更多的差异,但实际上现在项目已经成熟,它们更相似,而不是不同。然而,它们是不同的,因此我需要将它们分开 当前结构 销售表 | id | customer_id | customer_ref | ... | |---------|-------------|------------------

注意

我有一个记录所有销售的表和十四个包含销售额外信息的补充表。14个补充表的所有意图和目的均相同。它们是在很久以前创建的,当时最初的开发人员认为会有更多的差异,但实际上现在项目已经成熟,它们更相似,而不是不同。然而,它们是不同的,因此我需要将它们分开

当前结构 销售表

| id      | customer_id | customer_ref                         | ... |
|---------|-------------|--------------------------------------|-----|
| 1237567 | 354         | a6143f8c-b679-47be-9bc0-52457842913c | ... |
| 1237568 | 867         | ref89b72                             | ... |
| ...     | ...         | ...                                  | ... |
| 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                             | ... |
| ...     | ...             | ...               | ...         | ...                                  | ... |
补充表1类别:App\SuppOne

补充表2类别:App\suppltwo

表上没有将sales表连接到补充表的外键,但有一个“customer_id”和“customer_reference”,这两个外键对sales表和补充表都是唯一的,但它们不一致。当我需要获得关于某一特定销售的更多信息时,这就是目前用于加入这两个项目的内容

我使用的是Laravel5.1和MySQL数据库,我想在sales表中添加两个字段;补充_id和补充_type,以便快速有效地创建多态关系

理想结构 销售表

| id      | customer_id | customer_ref                         | ... |
|---------|-------------|--------------------------------------|-----|
| 1237567 | 354         | a6143f8c-b679-47be-9bc0-52457842913c | ... |
| 1237568 | 867         | ref89b72                             | ... |
| ...     | ...         | ...                                  | ... |
| 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中如何(如果可能的话)处理从表\u name到App\ClassName的映射。sales表中大约有150万条记录,在这些记录上循环不会花费很长时间。

行与行之间的一些东西

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


它基本上是一个带有双重连接选择的更新。尽管老实说,当Select会处理视觉效果时,你为什么要这样做?我想知道如何(如果可能的话)使用SQL完成,因为在迁移中使用PHP会花费太长时间。插入到表中\u从表1中新建Select*,Table2其中Table1.key1=Table2.key1?我如何处理从table_name到App\ClassName的映射?感谢您的支持,关于连接表(在极少数情况下,在customer_id和customer_reference上可能有多个匹配项),可以将其排序以获取最后一条记录吗?在更新调用中,我尝试了
DB::raw(“(选择max({$table}.id))
但这似乎没有按预期工作。类似地,我想在联接中添加WHERE子句,以便只匹配状态为“1”的记录。