2015-10-26 3 views
1

Я работаю над заполнением таблиц базы данных. В таблице есть поля, некоторые из которых перечислены.Заполнение поля базы данных с несколькими значениями

Рассмотрит пользователь, который имеет поле status, значение которого может быть active, inactive и т.д. Предположат, что мы можем изменить значение конфигурации и запуск сценария данные могут быть заполнены соответствующим образом.

Представим user таблицу, status поле как

'status' => array(
    'active' => 3, 
    'inactive', 
    'deleted', 
), 

В этом случае предположим, что мы должны создать 3 пользователей с status, active. 1 пользователь со статусом inactive и 1 с deleted.

В таблице может быть больше полей перечисления. Таким образом, конфигурация может расширяться. В зависимости от конфигурации и полей значения будут кратными.

Рассмотрите приведенный ниже пример.

Например:

$config = array(
    'table1name' => array(
     'field1' => array(
      'active' => 3, 
      'inactive', 
      'deleted', 
     ), 
     'field2' => array(
      'admin', 
      'user', 
      'editor' 
     ), 
     ...., 
     'more-fields' => array(
      'more-values', 
     ) 
    ), 
    'table2name' => array(
     'field1' => array(
      'active', 
      'inactive', 
      'deleted', 
     ), 
    ) 
); 

В этом случае необходимо заполнить table1 поле field1 которого с active, inactive, deleted и roles с admin, user, editor и т.д. (активный, неактивный и т.д. предоставляются только для Например, это могут быть только значения.)

Идея состоит в том, чтобы генерировать больше пользователей в зависимости от количества, если таковое имеется.

Например:

'status' => array(
    'active' => 10, 
    'inactive' => 2, 
    'deleted' => 3, 
), 
'roles' => array(
    'admin' => 2, 
    'user', 
    'editor' 
) 
...., 
'more-fields' => array(
    'more-values', 
) 

Так что будут

10 * 4 => активных пользователей (10 * 2 активного администратора/10 активного пользователя, 10 активного редактора) + 2 * 4 = > неактивные пользователи (2 неактивных администратора, 1 пользователь, 1 редактор) + 3 * 4 => удаленных пользователей в общей сложности.

Я борюсь за построение алгоритма для того же.

array(
    'status' => array(
     'active' => 10, 
     'inactive' => 2, 
     'deleted' => 3, 
    ), 
    'roles' => array(
     'admin' => 2, 
     'user', 
     'editor' 
    ), 
    ...., 
    'more-fields' => array(
     'more-values', 
    ) 
) 

// In this example you can see we have not covered the fields of the table when they are more than 1 on save.It looks we need to build the array with values first. 

foreach ($config as $table => $fields) { 
    foreach ($fields as $field => $values) { 
     foreach ($values as $key => $statusCount) { 
      if (is_string($key)) { 
       $model = new User(); 
       $model->$field = $key; 
       $model->another = 'value'; 
       $model->save(); 
      } else {    
       for ($i = 0; $i< $statusCount; $i++) { 
        $model = new User(); 
        $model->$field = $key; 
        $model->another = 'value'; 
        $model->save(); 
       } 
      } 
     } 
    } 
} 

UPDATE:

Изменения, сделанные в соответствии с @ в четвертой-птица ответ https://stackoverflow.com/a/33354032/487878

Проблема это выглядит только на 2-х полей, поля могут быть 1 или п.

ответ

1

Вы ищете такую ​​установку? (Не уверен, что поля для пользователя может быть, я использовал «роль» и «администратора» в этом примере.)

$fields = array(
    'status' => array(
     'active' => 10, 
     'inactive' => 2, 
     'deleted' => 3, 
    ), 
    'roles' => array(
     'admin', 
     'user', 
     'editor' 
    ) 
); 
$roles = $fields['roles']; 
$statuses = $fields['status']; 

foreach ($roles as $role) { 
    foreach ($statuses as $status => $statusCount) { 
     for ($i = 0; $i< $statusCount; $i++) { 
      $model = new User(); 
      $model->role = $role; 
      $model->status = $status; 
     } 
    } 
} 

// Обновление с динамическими свойствами

<?php 
class table1name { 
    public function save() {} 
} 
class table2name { 
    public function save() {} 
} 
$config = array(
    'table1name' => array(
     'field1' => array(
      'active' => 3, 
      'inactive', 
      'deleted', 
     ), 
     'field2' => array(
      'admin', 
      'user' => 2, 
      'editor' 
     ), 
     'more-fields' => array(
      'more-values' => 2, 
     ), 
     'color' => array(
      'blue' => 2, 
      'red' 
     ), 

    ), 
    'table2name' => array(
     'field1' => array(
      'active', 
      'inactive', 
      'deleted', 
     ), 
    ) 
); 

// Adjust data structure 
// If the key is a string, turn the key into values for the given multiplier in the same array. 
// Then unset the key. 
foreach ($config as $table => $fields) { 
    foreach ($fields as $field => $values) { 
     foreach ($values as $key => $statusCount) { 
      if (is_string($key)) { 
       for ($i = 0; $i< $statusCount; $i++) { 
        $config[$table][$field][] = $key; 
       } 
       unset($config[$table][$field][(string)$key]); 
      } 
     } 
    } 
} 

$cartesians = []; 

// If you want all the possible combinations for for example the 'table1name', you need a cartesian product. Used the function from this page: 
//http://stackoverflow.com/questions/6311779/finding-cartesian-product-with-php-associative-arrays 
function cartesian($input) { 
    $input = array_filter($input); 
    $result = array(array()); 

    foreach ($input as $key => $values) { 
     $append = array(); 
     foreach($result as $product) { 
      foreach($values as $item) { 
       $product[$key] = $item; 
       $append[] = $product; 
      } 
     } 
     $result = $append; 
    } 
    return $result; 
} 

// Create the cartesian products for all the keys in the $config array. 
foreach ($config as $key => $tables) { 
    $cartesians[$key] = cartesian($tables); 
} 

// Loop all the objects created by the cartesian function. 
foreach ($cartesians as $objectName => $cartesian) { 
    foreach($cartesian as $key => $value) { 
     $model = new $objectName(); 
     $model->$key = $value; 
     $model->save(); 
    } 
} 
+0

Ваш пример хорошо, проблема в том, что поля имеют динамическую конфигурацию (она может быть от одного до n).Поэтому мы не могли его ограничить. –

+0

Я обновил код другим примером, чтобы уточнить ожидаемые результаты. Является ли этот пример динамической конфигурацией, которую вы ищете? –

+0

Спасибо, как я уже говорил, вы не можете ожидать, что роли/статус - это поля. Я просто привел пример. Рассмотрим название полей в соответствии с другой таблицей. –

Смежные вопросы