在数据透视表中查找和存储类别在层次结构中的位置地址



首先,我使用的是Laravel 5.1 (PHP框架),我运行的是PHP 5.6.4,我面临的问题是真正与递归有关。

目前我的种子文件是(用一个糟糕的递归函数的借口):

    <?php
use IlluminateDatabaseSeeder;
use IlluminateDatabaseMigrationsMigration;
use eCommerceCategory;
class CategoryCategorySeeder extends Seeder
{
   protected $addressHolder;
   public function __construct() {
      $this->addressHolder = array();
   }
   private function recursive($array, $depth=0) {
      echo $depth."n";
      foreach($array as $category){
         // print_r( $category['category_id'] );
         if( isset( $category['sub_categories'] ) ){            
            $this->recursive($category['sub_categories'], $depth++);
         } else {
         }
      }
   }
    public function run()
    {
        DB::table('category_category')->delete();
        $categories = [
            [
               'category_id' => 2,
               'sub_categories' => [
                  [
                     'category_id' => 3,
                     'sub_categories' => [
                        [
                           'category_id' => 6
                        ],[
                           'category_id' => 7
                        ],[
                           'category_id' => 8
                        ],[
                           'category_id' => 9
                        ],[
                           'category_id' => 10
                        ],[
                           'category_id' => 11
                        ],[
                           'category_id' => 12
                        ],[
                           'category_id' => 13
                        ],[
                           'category_id' => 14
                        ],[
                           'category_id' => 15
                        ]
                     ]
                  ],[
                     'category_id' => 4,
                     'sub_categories' => [
                        [
                           'category_id' => 18
                        ],[
                           'category_id' => 19
                        ],[
                           'category_id' => 20
                        ],[
                           'category_id' => 21
                        ],[
                           'category_id' => 22
                        ],[
                           'category_id' => 23
                        ],[
                           'category_id' => 24
                        ],[
                           'category_id' => 25
                        ],[
                           'category_id' => 26
                        ],[
                           'category_id' => 27
                        ],[
                           'category_id' => 28
                        ],[
                           'category_id' => 29
                        ],[
                           'category_id' => 30
                        ],[
                           'category_id' => 31
                        ],[
                           'category_id' => 32
                        ]
                     ]
                  ],[
                     'category_id' => 5,
                     'sub_categories' => [
                        [
                           'category_id' => 16
                        ],[
                           'category_id' => 17
                        ]
                     ]
                  ]
               ]
            ],[
               'category_id' => 33,
               'sub_categories' => [
                  [
                     'category_id' => 34
                  ],[
                     'category_id' => 35
                  ],[
                     'category_id' => 36,
                     'sub_categories' => [
                        [
                           'category_id' => 37
                        ],[
                           'category_id' => 38
                        ],[
                           'category_id' => 39
                        ],[
                           'category_id' => 40
                        ],[
                           'category_id' => 41
                        ],[
                           'category_id' => 42
                        ],[
                           'category_id' => 43
                        ],[
                           'category_id' => 44
                        ],[
                           'category_id' => 45
                        ]
                     ]
                  ]
               ]
            ],[
               'category_id' => 46,
               'sub_categories' => [
                  [
                     'category_id' => 50
                  ],[
                     'category_id' => 51,
                     'sub_categories' => [
                        [
                           'category_id' => 54
                        ],[
                           'category_id' => 55
                        ],[
                           'category_id' => 56
                        ],[
                           'category_id' => 57
                        ]
                     ]                     
                  ],[
                     'category_id' => 52
                  ],[
                     'category_id' => 53
                  ],[
                     'category_id' => 137
                  ]
               ]
            ],[
               'category_id' => 47,
               'sub_categories' => [
                  [
                     'category_id' => 58
                  ],[
                     'category_id' => 59
                  ],[
                     'category_id' => 60
                  ],[
                     'category_id' => 61
                  ],[
                     'category_id' => 62
                  ],[
                     'category_id' => 63
                  ],[
                     'category_id' => 64
                  ],[
                     'category_id' => 65
                  ],[
                     'category_id' => 66
                  ],[
                     'category_id' => 67
                  ],[
                     'category_id' => 68
                  ],[
                     'category_id' => 69
                  ],[
                     'category_id' => 70
                  ],[
                     'category_id' => 71
                  ],[
                     'category_id' => 72
                  ]
               ]
            ],[
               'category_id' => 48,
               'sub_categories' => [
                  [
                     'category_id' => 73,
                     'sub_categories' => [
                        [
                           'category_id' => 78
                        ],[
                           'category_id' => 79
                        ]
                     ]
                  ],[
                     'category_id' => 74,
                     'sub_categories' => [
                        [
                           'category_id' => 80
                        ],[
                           'category_id' => 81
                        ],[
                           'category_id' => 82
                        ],[
                           'category_id' => 83
                        ]
                     ]
                  ],[
                     'category_id' => 75,
                     'sub_categories' => [
                        [
                           'category_id' => 84
                        ],
                        [
                           'category_id' => 85
                        ],
                        [
                           'category_id' => 86
                        ]
                     ]
                  ],[
                     'category_id' => 76,
                     'sub_categories' => [
                        [
                           'category_id' => 87
                        ],[
                           'category_id' => 88,
                           'sub_categories' => [
                              [
                                 'category_id' => 93
                              ],[
                                 'category_id' => 94
                              ],[
                                 'category_id' => 95
                              ]
                           ]
                        ],[
                           'category_id' => 89
                        ],[
                           'category_id' => 90
                        ],[
                           'category_id' => 91
                        ],[
                           'category_id' => 92
                        ]
                     ]
                  ],[
                     'category_id' => 77
                  ]
               ]
            ],[
               'category_id' => 49,
               'sub_categories' => [
                  [
                     'category_id' => 96
                  ],[
                     'category_id' => 97
                  ],[
                     'category_id' => 98
                  ],[
                     'category_id' => 99
                  ],[
                     'category_id' => 100
                  ],[
                     'category_id' => 135
                  ],[
                     'category_id' => 136
                  ],[
                     'category_id' => 138
                  ],[
                     'category_id' => 139
                  ],[
                     'category_id' => 140
                  ]
               ]
            ],[
               'category_id' => 134,
               'sub_categories' => [
                  [
                     'category_id' => 101,
                     'sub_categories' => [
                        [
                           'category_id' => 108
                        ],[
                           'category_id' => 109
                        ],[
                           'category_id' => 110
                        ]
                     ]
                  ],[
                     'category_id' => 102,
                     'sub_categories' => [
                        [
                           'category_id' => 111
                        ],[
                           'category_id' => 112
                        ],[
                           'category_id' => 113
                        ]
                     ]                     
                  ],[
                     'category_id' => 103,
                     'sub_categories' => [
                        [
                           'category_id' => 114
                        ],[
                           'category_id' => 115
                        ],[
                           'category_id' => 116
                        ],[
                           'category_id' => 117
                        ],[
                           'category_id' => 118
                        ]
                     ]
                  ],[
                     'category_id' => 104
                  ],[
                     'category_id' => 105
                  ],[
                     'category_id' => 106,
                     'sub_categories' => [
                        [
                           'category_id' => 119
                        ],[
                           'category_id' => 120
                        ],[
                           'category_id' => 121
                        ],[
                           'category_id' => 122
                        ],[
                           'category_id' => 123
                        ],[
                           'category_id' => 124
                        ],[
                           'category_id' => 125
                        ],[
                           'category_id' => 126
                        ],[
                           'category_id' => 127
                        ]
                     ]
                  ],[
                     'category_id' => 107
                  ]
               ]
            ],[
               'category_id' => 128,
               'sub_categories' => [
                  [
                     'category_id' => 129
                  ],[
                     'category_id' => 130
                  ],[
                     'category_id' => 131
                  ],[
                     'category_id' => 132
                  ],[
                     'category_id' => 133
                  ]
               ]
            ],[
               'category_id' => 134
            ],[
               'category_id' => 141,
               'sub_categories' => [
                  [
                     'category_id' => 142
                  ]
               ]
            ]
        ];
        $this->recursive($categories);
      }
}

我想通过每个"类别"递归(大型多维数组),并有一个"地址",这是在类别的层次结构中该类别来自哪里,这是因为在我的网站上一个类别可以属于许多其他类别。

这个种子类如果对于多对多关系的数据透视表类别具有。

在数据透视表中我有:

  • category_id - integer
  • parent_category_id - integer
  • address - string

所以一个例子可以是(这对代码中的数组是正确的):

    6
  • 3
  • "2-3-6"

所以" 2-3-4 "是该类别的特定实例在层次结构中的完整"地址" 6.

那么我如何递归地读取我的类别数组,并在数据透视表中为每个类别输入上面所述的三个字段呢?

我用下面的代码解决了这个问题。

我只是保留一个外部数组来记住每次迭代的位置,然后在函数内的另一个数组中,我填充id对应的类别信息,并内爆它的所有slugs,这是我需要在数据透视表中处理每个项目的所有需要,因为slugs是唯一的,并且可以用作SEO原因的路由参数。

private function recursive($categories, $depth=0)
{
  foreach($categories as $category) {
    array_push($this->locationHolder, $category['category_id']);
    if($depth == 0){
      $parent_id = 1;
    } else {
      $parent_id = $this->locationHolder[$depth-1];
    }
    $address_array = [];         
    foreach($this->locationHolder as $id) {
      array_push($address_array, Category::find($id)->slug);
    }
    DB::table('category_category')->insert([
      'category_id' => $category['category_id'],
      'parent_id' => $parent_id,
      'address' => implode("_", $address_array)
    ]);         
    if(isset($category['sub_categories'])) {
      $this->recursive($category['sub_categories'], $depth + 1);
    } else {
      array_pop($this->locationHolder);
    }
  }
  array_pop($this->locationHolder);
}

最新更新