Merhaba arkadaşlar,
Bu yazıda benim sıkça kullandığım ve kendi yazdığım bir fonksiyonu paylaşacağım. fonksiyonun amacı 2 tane Model sınıfından referans almış objeyi karşılaştırmak. Eğer objeler değer bakımından farklı ise 0, nitelik bakımından farklı ise -1, tüm nitelikleri ve değerleri eşit ise 1 değerini döndürüyor.
Fonksiyonu biraz değiştirerek Laravel’den başımsız bir şekilde herhangi 2 objeyi karşılaştıracak hale getirebilrisiniz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
/** * 2 tane Model sınıfını karşılaştırmak için kullanılıyor * * @param $object_old * @param $object * @param array $for_delete * * @return int */ if ( !function_exists('compare_objects') ) { function compare_objects($object_old, $object, $for_delete = []) { if ( empty($for_delete) ) { $for_delete = ['id', 'remember_token', 'guid', 'is_deleted', 'version', 'created_at', 'updated_at', 'deleted_at', 'created_by', 'updated_by', 'deleted_by']; } // Karşılaştırma işlemleri // 1. Sadece güncellenebilir ortak alanların olması için gereksiz alanlar diziden çıkartıldı $_tmp_contact_old = $object_old->toArray(); $_tmp_contact = $object->toArray(); // 2. Gereksiz alanlar çıkartıldı foreach ( $_tmp_contact_old as $key => $value ) { if ( in_array($key, $for_delete) ) { unset($_tmp_contact_old[ $key ]); } } foreach ( $_tmp_contact as $key => $value ) { if ( in_array($key, $for_delete) ) { unset($_tmp_contact[ $key ]); } } // 3. Karşılaştırma yapıldı if ( count(array_diff_key($_tmp_contact_old, $_tmp_contact)) == 0 && count(array_diff_key($_tmp_contact, $_tmp_contact_old)) == 0 ) { if ( $_tmp_contact_old == $_tmp_contact ) { // Objeler eşit return 1; } else { // Objeler farklı return 0; } } else { // Objelerdeki alanlar eşit değil ! return -1; } } } |
Bu fonksiyonu versiyon geçmişi tuttuğum bir projede kullanmak için yazdım. Kısaca örneklendirecek olursam; Elimde User modelinden 1 kullanıcı kaydı var. Kişi profilini 5 kez farklı zamanlarda güncelledi. Her güncelleme sonrasında bir önceki kaydı silindi olarak işaretleyip yeni kaydı ekliyorum ve bir versiyon numarası veriyorum. Artık ilk oluşturulan kayıtla beraber toplam 6 satırlık veri var elimde. Ben kullanıcıya ait geçmişi görmek istediğimde kullanıcıyı guid
değerine göre çağırıp versiyon numarasına göre tersten sıralıyorum. Sonra bir döngüye sokarak bu fonksiyondan geçirip uygun bir tablo biçiminde yazdırıyorum ve kullanıcıya ait değişim geçmişini görmüş oluyorum.
Bu fonksiyonun bir benzerini diziler için de yazdım. Php’de Dizi Karşılaştıma başlıklı yazımdan inceleyebilirsiniz.
Faydası olması dileğiyle..
İlk Yorumu Siz Yapın