SQL обновление всех данных в базе данных - PullRequest
0 голосов
/ 30 января 2019

Я написал код для добавления и обновления пользователей, а также хочу добавлять и обновлять категории, в которых они могут работать. Добавленные пользователи попадут в таблицу пользователей, а категории, к которым они могут получить доступ, - в таблицу category_permitted.У меня есть следующий код для добавления и обновления таблиц:

if ($user_info) {


if ($act == "add") {

if ($user_info) {
    $array = array(
            'user_id' => $user_info,
            'category_id' => $temp['cat_access']
    );

$category_permitted->addCategoryAccess($array);
}

} else {

if ($user_info) {

    $array = array(
            'user_id' => $id,
            'category_id' => $temp['cat_access']
    );

$deleteold = $category_permitted->deleteCategoryAccess($id);

$category_permitted->addCategoryAccess($array);
    }
}
    }

Это моя функция для добавления и обновления доступа к категории:

public function addCategoryAccess($data, $is_die = false){

    return $this->insert($data, $is_die);

}

public function updateCategoryAccess($data, $id, $is_die = false){

    $args = array(
        'where' => array('user_id' => $id),
    );

    return $this->update($data, $args, $is_die);

}

И это данные в таблице базы данных click here to see database.

Моя функция обновления обновляет все данные столбца category_id с добавляемым номером при обновлении доступа к категории для пользователя.

Я хочу оставить 2 и 3как есть, и добавьте другой идентификатор категории, равный 1, но после запуска кода обновления он обновляет данные следующим образом. click here to see unexpected result Нужно ли добавить еще одно условие к WHERE CLAUSE, чтобы получить ожидаемый результат?

Ответы [ 2 ]

0 голосов
/ 31 января 2019

Выполнение этого в моем коде сработало для меня.Я вызвал функцию $deleteold = $category_permitted->deleteCategoryAccess($id); непосредственно перед циклом for, чтобы избежать удаления предыдущих данных, удаляемых на каждой итерации.

if ($user_info) {

$cat_access = (isset($_POST['cat_access']) && !empty($_POST['cat_access'])) ? ($_POST['cat_access']) : $_SESSION['cat_access'];

$value = array();

if (!empty( $cat_access ) && is_array( $cat_access ) ) {

  foreach( $cat_access as $key => $item ) {

    $value[] = filter_var( $item, FILTER_SANITIZE_NUMBER_INT );

  }

}

$categoryData = $value;

$temp = array();

    if ($categoryData) {

        $count = count($categoryData);

        if ($count > 0) {

            $deleteold = $category_permitted->deleteCategoryAccess($id);

            for($i=0; $i<$count; $i++){

            $temp =array(

                'cat_access' => $categoryData[$i]

            );

            if ($act == "add") {

                if ($user_info) {
                    $array = array(
                            'user_id' => $user_info,
                            'category_id' => $temp['cat_access']
                    );

                $category_permitted->addCategoryAccess($array);
                }

            } else {

                if ($user_info) {

                    $array = array(
                            'user_id' => $id,
                            'category_id' => $temp['cat_access']
                    );

                $category_permitted->addCategoryAccess($array);
                }
            }

        }

        }

}

}
0 голосов
/ 30 января 2019

Чтобы обновить только одну строку, вам необходим уникальный идентификатор для этой строки.

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

$args = array(
    'where' => array('id' => $category_permitted_id),
);

В качестве альтернативы, если вы знаете, какая категория меняется, а отношение (user_id, category_id) уникально, вы можете добавить изменяющуюся категорию к where.

$args = array(
    'where' => array(
        'user_id' => $user_id,
        'category_id' => $category_id
    ),
);

Обратите внимание, , что я не знаю ваш уровень абстракции базы данных, и я подразумеваю, что вы можете просто добавить еще одну запись в массив, чтобы поставить условия в 'И', это может быть неправильно в вашем случае.

Управление отношениями таким образом требует немного усилий, и, на мой взгляд, оно того не стоит.Если вы можете изменить логику приложения, я предлагаю вам переключиться на использование только вставки / удаления, например:

  • Добавить разрешенную категорию: просто добавьте ее, создав новую запись свставить

  • Удалить разрешенную категорию: удалить ее с помощью функции удаления

  • Изменить разрешенную категорию на другую: удалить изменяющуюся идобавить новый

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...