Tôi đang tăng sự kiện Yii trên beforeSave của mô hình, chỉ được kích hoạt nếu một thuộc tính cụ thể của mô hình được thay đổi. Cách duy nhất tôi có thể nghĩ về cách thực hiện điều này tại thời điểm này là tạo một đối tượng AR mới và truy vấn DB cho mô hình cũ bằng PK hiện tại, nhưng điều này không được tối ưu hóa rất tốt.Yii khi cập nhật, phát hiện xem một thuộc tính AR cụ thể đã được thay đổi trên beforeSave()
Dưới đây là những gì tôi có ngay bây giờ (lưu ý rằng bảng của tôi không có một PK, đó là lý do tại sao tôi truy vấn bởi tất cả các thuộc tính, bên cạnh những người tôi đang so sánh với - vì thế unset
chức năng):
public function beforeSave()
{
if(!$this->isNewRecord){ // only when a record is modified
$newAttributes = $this->attributes;
unset($newAttributes['level']);
$oldModel = self::model()->findByAttributes($newAttributes);
if($oldModel->level != $this->level)
// Raising event here
}
return parent::beforeSave();
}
Có cách tiếp cận nào tốt hơn không? Có thể lưu trữ các thuộc tính cũ trong thuộc tính cục bộ mới trong afterFind()
?
Đây thực sự là chỉ "sạch" cách để làm điều đó trong Yii. Những gì tôi đã làm là triển khai một ActiveRecord có nguồn gốc có chức năng được tích hợp sẵn và làm cho nó có sẵn cho tất cả các mô hình của tôi. Dễ dàng hơn rất nhiều so với làm lại lần nữa. Tôi cũng đưa ra các phương thức như "getIsChanged()" và "getChangedProperties()", v.v. – Blizz