$model->touch('last_purchase') обновляет все timestamp

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
TopClans
Сообщения: 23
Зарегистрирован: 2019.04.27, 10:44

$model->touch('last_purchase') обновляет все timestamp

Сообщение TopClans » 2019.10.22, 14:31

В модели настроил поведение :

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

public function behaviors()
	{
		return [
			// Other behaviors
			'timestamp' => [
				'class' => TimestampBehavior::className(),
				'attributes' => [
					ActiveRecord::EVENT_BEFORE_INSERT => ['registered_at'],
				],
				'value' => new Expression('NOW()'),
			],
		];
	}
при добавлении новой записи работает нормально, а вот когда мне надо вручную обновить дату последней покупки (это делается именно вручную при некоторых условиях, ивент before_update не подходит), "трогаю" его из контроллера:

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

$client->touch('last_purchase');
но в итоге обновляется и дата регистрации клиента, т.е. registered_at.
Покопался в исходном коде метода touch - там вроде всё логично, в него передаёт атрибут, для него задаётся время ивента или текущее. не понимаю, как в этот метод попадает и второй атрибут. Если атрибуты берутся из настроек модуля поведения, то какой смысл в touch(конкретный атрибут), если всё равно обновляются все колонки? да и в документации к touch() написано: "The name of the attribute to update.", то есть вроде бы это конкретный атрибут, а не все.
Что я делаю не так?

yiiliveext
Сообщения: 795
Зарегистрирован: 2019.08.13, 01:49

Re: $model->touch('last_purchase') обновляет все timestamp

Сообщение yiiliveext » 2019.10.22, 18:25

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

public function behaviors()
	{
		return [
			// Other behaviors
			'timestamp' => [
				'class' => TimestampBehavior::className(),
				'createdAtAttribute' => 'registered_at',
                                'updatedAtAttribute' => false,
				'value' => new Expression('NOW()'),
			],
		];
	}

TopClans
Сообщения: 23
Зарегистрирован: 2019.04.27, 10:44

Re: $model->touch('last_purchase') обновляет все timestamp

Сообщение TopClans » 2019.10.23, 14:58

так тоже пробовал, результат всё равно такой же: обновляет оба поля

yiiliveext
Сообщения: 795
Зарегистрирован: 2019.08.13, 01:49

Re: $model->touch('last_purchase') обновляет все timestamp

Сообщение yiiliveext » 2019.10.25, 12:15

Смотрите другие обработчики beforeUpdate, сам метод touch() обновляет только одно поле.

Ответить