2013-11-24 48 views
14

kaydederken değişiklikleri tespit edin Laravel 4 çerçevesini kullanıyorum ve bir save()'un başarılı olup olmadığına bağlı olarak bildirimleri görüntülemenin bir yolunu bulmaya çalışıyorum. İşte ben bugüne kadar ne var:Laravel 4: Eloquent

if($user->save()) { 
     Session::flash('success','woohoo success'); 
    } else { 
     Session::flash('error','uhoh error'); 
    } 
    return Redirect::action('[email protected]', array('users' => $id)); 

Sorunum kullanıcı kaydedildiğinde her zaman true döndürür yani, herhangi bir değişiklik veritabanına yapılmış olsa bile (ben updated_at zaman damgası bu biliyorum). Herhangi bir değişikliğin Laravel'i kullanıp kullanmadığını tespit etmenin bir yolu var mı?

cevap

28

Neyi başarmak istediğinize bağlı olarak, burada bazı seçenekleriniz vardır. Önce aşağıya göz atın. Laravel Çerçeve 4'ün Etkili O/RM için öz doğrulayarak akıllı modeller - Ateşli paketi ile

Modeli Kancalar Eğer autovalidating modelleri ile ilgileniyorsanız
, https://github.com/laravelbook/ardent paket bakabilirsiniz. Dışında büyük bir doğrulama ek modeli kancaları kullanabileceğiniz sunduğu özellikler oluşturur:

Here's the complete list of available hooks: 

before/afterCreate() 
before/afterSave() 
before/afterUpdate() 
before/afterDelete() 
before/afterValidate() - when returning false will halt validation, thus making save() operations fail as well since the validation was a failure. 

laravel Modeli Olaylar
herhangi bir ek malzeme kullanmak istemiyorum, sadece aslında (yani laravel Modeli Olaylar kullanabilirsiniz Ateşli kancalara sarılır. , oluşturulan, güncelleme, güncellenen, kaydetme, kaydedilmiş, silme, silinen yaratma: http://laravel.com/docs/eloquent#model-events

, Etkili modeller aşağıdaki yöntemleri kullanarak modelin yaşam döngüsü içinde farklı puan içine kanca sağlayan çeşitli etkinlikler ateş docs içine bak , geri yüklendi, geri yüklendi.

İlk kez yeni bir öğe kaydedildiğinde, oluşturma ve oluşturulan olaylar tetiklenir. Bir öğe yeni değilse ve kaydetme yöntemi olarak adlandırılırsa, güncelleme/güncelleştirilmiş olaylar tetiklenir. Her iki durumda da, kaydetme/kaydetme olayları patlayacaktır.

false ise, güncelleme tasarruf veya etkinlikleri silme, yaratıklarından döndürülen, aksiyon iptal edilecektir:

Çözüm
Son olarak, reffering size yukarıdaki yaklaşımları yararlanabilirler sorgulamaya çeşitli şekillerde ama en açıkçası, Eloquent Modelleri 'getDirty()api docs here yöntemiyle birleştirebilirsiniz. Örneğin, kaydetme olayıyla çalışacaktır.

Yourmodel::saving(function($model) 
{ 
    foreach($model->getDirty() as $attribute => $value){ 
     $original= $model->getOriginal($attribute); 
     echo "Changed $attribute from '$original' to '$value'<br/>\r\n"; 
    } 
    return true; //if false the model wont save! 
}); 
+0

Çok ayrıntılı cevap! Çok teşekkürler. – Karl

+0

Laravel 5.3> https://github.com/laravel/framework/blob/5.3/src/Illuminate/Database/Eloquent/Model.php#L3177. – imme

5

Eloquent modelinde (model.php) getDirty() yöntemine bakabilirsiniz. Bu yöntem, değiştirilen öznitelikleri döndürmelidir.

+3

is_dirty() ilişki verileri üzerinde çalışmıyor mu? – user269867

+0

Evet, ancak pivot ilişkilerinde değil. Bu, bir Eloquent modelinin geriye dönük olarak yeniden tanımlanmasıyla birlikte tanımlanmış ilişkilerin gerçekten bir özlem olduğunu. –