#php #codeigniter
#php #codeigniter
Вопрос:
Я довольно новичок в OOPHP и CI, поэтому у меня возник быстрый вопрос, на который некоторым людям было бы легко ответить.
Прямо сейчас у меня есть форма с примерно 100 флажками, все с одинаковыми именами, поэтому они будут отправлены в виде массива чисел.
У меня также есть таблица с именем tag_restaurant_rel, которая представляет собой реляционную таблицу, настроенную как InnoDB, и оба restaurant_id
и tag_id
являются внешними ключами, относящимися к соответствующим столбцам в двух других таблицах.
Форма будет отправлена с 1 идентификатором restaurant_id и несколькими идентификаторами tag_id.
В таблице tag_restaurant_rel для каждого tag_id в массиве есть запись с одним и тем же restaurant_id из формы.
Что мне нужно, так это чтобы форма была отправлена, и в зависимости от массива значений флажков таблице tag_restaurant_rel нужно будет удалить записи, которых нет в массиве, и создать новую запись для каждого tag_id в массиве.
Мне больше всего интересно, как наиболее эффективным способом реализовать этот стиль ООП и CI.
Ответ №1:
Если для таблицы rag_restaurant_rel нет идентификатора или идентификатор не имеет значения (AI int или что-то еще, на что нет ссылок в другом месте), я бы подумал, что самым простым способом было бы стереть таблицу, где restaurant_id = что угодно, а затем просто вставить все представленные идентификаторы.
Я не очень знаком с CI и не знаю, как вы взаимодействуете с базой данных, поэтому со стороны скрипта у меня не так много информации. Если вы используете MySQL, я считаю, что подготовленные инструкции очень эффективны для нескольких вставок, так что, возможно, это было бы правильным решением. Что касается ООП, опять же, в зависимости от того, как вы взаимодействуете с базой данных, это будет просто вопрос добавления 1, 2 или 3 методов.
Что-то вроде:
public function updateRestaurantRelations($restId, $tagArray)
{
//called from your script
if($this->wipeCurrentTags($restId)){
if($this->addNewTags($restId, $tagArray)){
return true;
}
}
return false;
}
private function wipeCurrentTags($restId)
{
//perform query here or call delete method
//return true on success and false on failure
}
private function addNewTags($restId, $tagArray)
{
//perform query here or build prepared statement loop here or call insert method
//return true on success and false on failure
}
Опять же, я не знаю, насколько это совместимо с CI.
Вы также могли бы сначала добавить размещенные теги (или выбрать текущие перед удалением), чтобы в случае ошибки при вставке ваша таблица не была очищена от всех тегов, которые уже были в базе данных (или вы могли бы их восстановить).