обновить несколько значений выбора в базе данных mysql с помощью codeigniter

У меня есть множественный выбор для категорий продуктов, и у меня есть 3 таблицы для них. Мои таблицы выглядят так:

продукты:

product_id   |   product_name
     1       |    my_package

категории:

category_id   |   category_name
     1        |     category 1
     2        |     category 2
     3        |     category 3

категории_продуктов:

pc_id   |   product_id   |   category_id
  1     |         1      |        1
  2     |         1      |        2
  3     |         1      |        3

Когда я хочу обновить таблицу product_categories, она не обновляется. Я хотел установить только одну категорию для своего продукта и удалить две другие, но когда я посмотрел на свою базу данных, я увидел, что она изменила все строки, например:

категории_продуктов:

pc_id   |    product_id   |   category_id
  1     |         1       |        2
  2     |         1       |        2
  3     |         1       |        2

Это мой код:

foreach($selected_categories as $selected_category){
    $selected_category_options[] = $selected_category->category_Id;
}

echo form_multiselect('product_category_id[]', $category_options, set_value('product_category_id', $selected_category_options));

и это код в моей модели:

foreach($_POST['product_category_id'] as $key => $product_category_id){

    $options = array(
        'category_Id' => $product_category_id
    );

    $this->db->where('product_id', $options['product_id']);  
    $this->db->update('product_categories', $options);
}

person Afshin    schedule 29.11.2013    source источник


Ответы (1)


Сначала удалите категории, а затем вставьте

$options = array(
    'category_Id' => $_POST['product_category_id'][0],
    'product_id'  =>  'product id here'/* first category will be inserted only*/
);

$this->db->query("DELETE FROM product_categories WHERE product_id=". $options['product_id']); /* this will delete all categories assigned to $options['product_id']*/

$this->db->insert('product_categories', $options); /* will insert the first category from $_POST['product_category_id']*/

Если вы хотите мультиобновление, попробуйте это

$this->db->query("DELETE FROM product_categories WHERE product_id='product id here'";
foreach($_POST['product_category_id'] as $key => $product_category_id){


$options = array(
    'category_Id' => $product_category_id,
    'product_id'  =>  'product id here' /* first category will be inserted only*/
);    
    $this->db->insert('product_categories', $options);
}
person M Khalid Junaid    schedule 29.11.2013
comment
это правильный способ сделать это?! или это просто уловка для избавления от проблемы?! - person Afshin; 29.11.2013
comment
@Afshin это неправильный способ, это быстрое решение, правильное решение - получить идентификаторы кошек из сообщения и сравнить с идентификаторами кошек из базы данных и удалить те, которые не находятся в $_POST, из базы данных и добавить те, которые являются новыми, как при сравнении - person M Khalid Junaid; 29.11.2013
comment
Я знаю, что этот пост старый, извините за это. Но просто из любопытства, можно ли обновить только новый элемент в базе данных и удалить те, которые не выбраны. Вместо того, чтобы сначала удалить все и обновить. У меня была такая же проблема с флажком. Но я смог исправить это с помощью скрытого поля. - person Dexter; 28.10.2018