Как удалить все записи с ::deleteAll() в yii2

132
21 марта 2018, 06:06

В таблице хранятся выбранные пользователем данные. Среди прочих в таблице есть поле day и news_date. Day хранится в целочисленном формате (например, 9), news_date в формате int (timestamp) (например 1502229600 - это Tue, 08 Aug 2017 22:00:00 GMT).

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

foreach ($text as $id => $newsText) (здесь $text - массив с выбранными данными, $id - id новости и $newsText - текст новости) заполняют нужные поля таблицы (примерно так $model->id_news = $id;) и сохраняются в базу.

Проблема: выбрана может быть только одна новость из столбца за один год. Т.е если пользователь выбирает новость из левого столбца "2017" то необходимо удалить все новости за 2017-й год (news_date преобразую в год) день этой новости в поле day из таблицы и сохранить запись заново.

Пытаюсь сделать как то вот так

foreach ($text as $id => $newsText) {
     //ищу в таблице запись по $id 
      $thisDayNew = $model::findOne(["id_news" => (int) $id]);
    //а дальше не знаю что и как делать :(
      if ((int) $thisDayNew->id_news != (int) $id) {
    //удалить все новости $id которых не подошло
   //и добавить новую
    $model = new ThisDay;
    $model::deleteAll
(["FROM_UNIXTIME(news_date, '%Y')"
 => 
date("Y", $tdNew->news->cdate),
 "day" =>
 date('j', mktime(0, 0, 0, 
 date('m', $tdNew->news_date),
 date('d', $tdNew->news_date),
 date('Y', $tdNew->news_date)))]);
   } else {
//просто вставляю новую запись (это сделано уже:))
}

Пояснение: В date('Y', $tdNew->news_date) я получаю дату публикации новости

Но этот код никак не срабатывает. Как реализовать данный функционал удаления?

P.S

var_dump($thisDayNew); подсказывает что $thisDayNew хранит массив как на изображении ниже

Answer 1

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

//если массив пустой, значит выбранной новости нет в таблице ThisDay
if (!$thisDayNew) {
$model = new ThisDay;
//следовательно ищем по id выбранной новости в другой таблице
$newsM = News::findOne(["id" => $id]);
$model::deleteAll(["FROM_UNIXTIME(news_date, '%Y')"
//и подставляем данные уже из нее, где они нужны
    => date("Y", $newsM->cdate_int),
    "day" =>
    date('j', mktime(0, 0, 0,
            date('m', $newsM->cdate_int),
            date('d', $newsM->cdate_int),
            date('Y', $newsM->cdate_int)))]);
//тут код сохранения новых данных
}
READ ALSO
Проверка на успешное добавление данных

Проверка на успешное добавление данных

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

166
BITRIX Экспорт в CSV: в IP_PROP вместо NAME сохраняет ID

BITRIX Экспорт в CSV: в IP_PROP вместо NAME сохраняет ID

Добрый день! Пытаюсь сделать выгрузку CSV товаров с сайта на BitrixИспользую стандартный компонент Контент->Инфоблоки->ЭкспортCSV

200
массовый insert

массовый insert

Есть переменная $search она содержит 0,44,77,22,113 Вторая переменная $del она содержит 33,66

133
Laravel многие ко многим

Laravel многие ко многим

Есть три таблицы в БДСвязь многие ко многим

196