Nesneler ile Veri güncelleniyor

3 Cevap php

Yani, ben bir kayıt var diyelim:

$record = new Record();

ve ben o kayda bazı veri atamak Diyelim ki:

$record->setName("SomeBobJoePerson");

Nasıl veritabanına içine alabilirim. Öyleyim ....

A) modülü bunu ettiniz.

class Record{
    public function __construct(DatabaseConnection $database)
    {
        $this->database = $database;
    }
    public function setName($name)
    {
        $this->database->query("query stuff here");
        $this->name = $name;
    }
}

B) yazısının sonunda modüller ile çalıştırın

class Record{
    private $changed = false;
    public function __construct(array $data=array())
    {
        $this->data = $data;
    }
    public function setName($name)
    {
        $this->data['name'] = $name;
        $this->changed = true;
    }
    public function isChanged()
    {
        return $this->changed;
    }
    public function toArray()
    {
        return $this->array;
    }
}
class Updater
{
    public function update(array $records)
    {
         foreach($records as $record)
         {
             if($record->isChanged())
             {
                 $this->updateRecord($record->toArray());
             }

         }
    }
    public function updateRecord(){ // updates stuff
    }


 }

3 Cevap

Eğer yourslef sorabilirsiniz bir soru tekerleği veya yeniden icat etmek istiyorum olup olmadığıdır. Propel veya Doctrine zaten (R) nesnesi uygulamak gibi ORM katmanları haritalama DBMS, böylece kendi uygulama detayları bakmak olabilir.

Tahrik ikinci yaklaşım kullanacağız, hatta (en azından veritabanı etkileşimi tutacak) sadece tek bir güncelleştirme deyimi oluşturmak için bir alan seviyede bayrakları tutmak. Sen onların kaynağını çalışma eğer bir şey öğrenmek (ya da daha iyisi, bunların uygulanmasını zaman israf durdurmak ve kullanımı - pişman olmaz: p) olacak.

Bu sorguları mümkünse konsolide ederek operasyonları optimize sağlar çünkü uygulamak için planı nasıl bağlıdır ... (Bir isteğin sonunda) bir tek noktada bütün yazıyor yapmak güzel. Ama solucan bir bütün diğer can açabilirsiniz nedir silme / güncelleme / ucun takip etmek için bir UnitOfWork benzer bir şey yaratmak zorunda yapmak için.

Eğer varlık üzerinde kalıcılık yöntemini çağırdığınızda doğrudan yaparsanız Öte yandan sonra oldukça fazla bu konuda endişelenmenize gerek yok.

Her iki yaklaşım olsa da size her zaman nesne mevcut veri olduğundan emin olmak için bir yol ama o seçtiğiniz yaklaşım ile karmaşıklık değişir uygulanması için gerekli çalışma olması anlamına.

Örnek A setName denir her veritabanını günceller. Bu işlev basit yazma erişimcisine gibi görünüyor ama (vb, bir sorgu yürütülürken, veritabanına bağlanırken) çağrıldığında pahalı eylemleri gerçekleştirir. Bu kasıtsız site etkileri Örnek B çok daha çekici olun.

Bir başka örnek olarak: Daha sonra size bir kayıt inceler ve Tutanak geçerli bir durumda olmasını sağlayan bir Validator sınıfı gerekebilir. Ama Record incelemek için bir isim belirleyerek ilk tanımlamanız gerekir - yani devlet var doğrulamak için önce Record devam edilecektir. Defining object state is not the same as persisting object state.

Bir veri modeli yaklaşımı yerine kayıt-temelli yaklaşımın daha iyi çalışabilir. Örneğin:

class Model {

        protected $_props= array();

        public $changed= false;

        static public $models= array();

        function __set($name, $value) {
            $this->changed= true;
            $this->_props[$name]= $value;
        }

        function __construct() {
            Model::$models[]= $this;
        }

        public function save() {
            // Execute database query for saving the current Model
        }

        static public function update() {
            foreach (Model::$models as $model) {
                if ($model->changed) {
                    $model->save();
                }
            }
        }
}

Farklı Model türleri oluşturmak için geldiğinde bir model-tabanlı çözüm gerçekten parlar. Örneğin:

class Person extends Model {
        public function save() {
            // Execute person-specific write operations
        }    
}

class Doctor extends Person {
        public function save() {
            // Execute all Person write operations
            parent::save();
            // Save the extra bits that belong to a doctor
        }
} 

$person1= new Person();
$person->firstname= 'Jon';
$person->lastname= 'Skeet';

$doctor1= new Doctor();
$doctor1->firstname= 'House';
$doctor1->lastname= 'MD';

// Save all modified models
Model::update();

Ben nadiren toplu güncelleme mekanizmaları bu tür için kullanmak bulabilirsiniz rağmen. Yaz koşulları genellikle daha özeldir.