FitTech
@FitTech

Обнулить и сохранить?

Есть в таблице столбец (active). В нем может быть только один true, все остальное должно быть false. То есть при изменении одного так же меняются все. Подскажите, пожалуйста, как это реализовать?

Мой способ:
В моделе таблицы добавить метод setActive:
в нем сделать два запроса, первый который поставит всем false
$resetFields = \Yii::$app->db->createCommand("UPDATE table SET active=:no")
            ->bindValue(':no', 0)
            ->execute();

Второй, который запишет true нужному полю:
$query = \Yii::$app->db->createCommand("UPDATE table SET true=:yes WHERE id=:id")
            ->bindValue(':id', $this->id)
            ->bindValue(':yes', 1)
            ->execute();
  • Вопрос задан
  • 318 просмотров
Пригласить эксперта
Ответы на вопрос 4
index0h
@index0h
PHP, Golang. https://github.com/index0h
Зачем вам 2 запроса?
UPDATE `table`
SET `active` = IF(`id` = :id, 1, 0);
Ответ написан
Комментировать
@AnneSmith
самая ленивая
хорошо бы спецы по DB сказали что быстрее работает: update, order by + update, или select + update
иначе можно отсортировать по значению и обновить только первый или последний элемент, или просто его выбрать и обновить
Ответ написан
Комментировать
@cheevauva
Как вариант можешь создать таблицу table_active_attribute со структурой
id
table_id
active


По итогу в этой новой таблице будет храниться одна запись, которая через table_id будет связываться с активной записью из table. В результате чего, тебе нужно будет менеджерить только одну запись в таблице table_active_attribute, а не обновлять все записи в table. Минус этого варианта, в том что если ты захочешь использовать этот атрибут, то нужно использовать join
Ответ написан
Комментировать
@Quieteroks
php программист
С моей точки зрения, Вам лучше уточнить свой первый запрос.
Добавить индекс по полю active и делать два запроса на обновление всего двух записей, что значительно ускорит первый запрос на большом объеме данных (кстати вы не сказали, на сколько большая таблица может быть).

Убираем активный с условием:
$resetFields = \Yii::$app->db->createCommand("UPDATE table SET active=:no WHERE active=:yes")
            ->bindValue(':no', 0)
            ->bindValue(':yes', 1)
            ->execute();
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы