Страница 1 из 1

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

Добавлено: 2019.10.22, 14:31
TopClans
В модели настроил поведение :

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

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.", то есть вроде бы это конкретный атрибут, а не все.
Что я делаю не так?

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

Добавлено: 2019.10.22, 18:25
yiiliveext

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

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

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

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

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

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