Обновление записи ActiveRecord

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
domowdenis
Сообщения: 35
Зарегистрирован: 2018.12.24, 17:29

Обновление записи ActiveRecord

Сообщение domowdenis »

Добрый вечер.

Хочу обновить поле в таблице таким вот кодом

Код: Выделить всё

	//Обновляем статус товара
        foreach ($responce as $item) {
            $status = 0;

            if ($item->product_avaible == 0) {
                $status = 0;
            }
            else if ($item->product_avaible > 0 && $item->product_avaible < 3) {
                $status = 1;
            }
            else if ($item->product_avaible > 3) {
                $status = 2;
            }

            $product = Product::find()->where(['id' => $item->product_id])->andWhere(['cloth_name' => $item->product_subgroup])->one();
            $product->avaible = $status;

            if(!$product->save()){
                throw new \RuntimeException(Yii::t('app', 'Ошибка при обновлении товара ' . $product->name . ' ( ' . $product->id . ' )'));
            }

            continue;
        }
Получаю ошибку - PHP Warning – yii\base\ErrorException
Creating default object from empty value

Меняю SELECT на такой - все работает

Код: Выделить всё

        //Обновляем статус товара
        foreach ($responce as $item) {
            $status = 0;

            if ($item->product_avaible == 0) {
                $status = 0;
            }
            else if ($item->product_avaible > 0 && $item->product_avaible < 3) {
                $status = 1;
            }
            else if ($item->product_avaible > 3) {
                $status = 2;
            }

            $product = Product::findOne($item->product_id);
            $product->avaible = $status;

            if(!$product->save()){
                throw new \RuntimeException(Yii::t('app', 'Ошибка при обновлении товара ' . $product->name . ' ( ' . $product->id . ' )'));
            }

            continue;
        }

Не мог бы кто-то обьяснить, а чем разница между

Код: Выделить всё

            
            $product = Product::find()->where(['id' => $item->product_id])->andWhere(['cloth_name' => $item->product_subgroup])->one();
            $product = Product::findOne($item->product_id);
Ведь и там и там одинаковый объект приходит?
Prooksius
Сообщения: 100
Зарегистрирован: 2019.01.17, 23:24

Re: Обновление записи ActiveRecord

Сообщение Prooksius »

Может быть, запрос с find() не нашел ни одной записи, удовлетворяющей условию. Проверьте, что в $item->product_subgroup. Вероятно товаров с cloth_name = $item->product_subgroup нет.
В классе Product не переопределен метод find() ?
domowdenis
Сообщения: 35
Зарегистрирован: 2018.12.24, 17:29

Re: Обновление записи ActiveRecord

Сообщение domowdenis »

1)Проверял, выводил результаты обоих запросов в страницу ч/з print_r и построчно сравнивал на двух экранах. В обоих случая - найдена запись и она идентична (ну или показалась мне такой)
2)Нет, не переопределен
domowdenis
Сообщения: 35
Зарегистрирован: 2018.12.24, 17:29

Re: Обновление записи ActiveRecord

Сообщение domowdenis »

Все странней и странней)))
Переписал запрос на такой

Код: Выделить всё

$product = Product::find()->where(['id' => $item->product_id])->one();
Отработало. Т.е. понимаю - что с вторым условием что-то не так.

Возращаю запрос

Код: Выделить всё

$product = Product::find()->where(['id' => $item->product_id])->andWhere(['cloth_name' => $item->product_subgroup]);
var_dump($product->createCommand()->getRawSql());
Вывожу текст запроса ч/з ->getRawSql() - получаю запрос
SELECT * FROM `product` WHERE (`id`=7203) AND (`cloth_name`='A') - который вполне находит мне нужную запись

Не понимаю
skynin
Сообщения: 400
Зарегистрирован: 2017.12.12, 10:09

Re: Обновление записи ActiveRecord

Сообщение skynin »

domowdenis писал(а): 2020.06.15, 23:13 Получаю ошибку - PHP Warning – yii\base\ErrorException
Creating default object from empty value
в какой строке ошибка?
посмотрите в логе или дебаг панели
смотрите так же стектейс
Не желайте странного, и не будет у вас головной боли чтобы достичь этого странного.
Тем более что окажется что оно вам и не нужно было, странное это.
Prooksius
Сообщения: 100
Зарегистрирован: 2019.01.17, 23:24

Re: Обновление записи ActiveRecord

Сообщение Prooksius »

Ну на крайний случай можно так еще сделать

Код: Выделить всё

 $product = Product::findOne(['id' => $item->product_id, 'cloth_name' => $item->product_subgroup]);
 
Но понять, почему ошибка в том случае, тоже нужно..
Ответить