ORM kaydetmek nasıl I) yöntemi bir güncelleştirme veya ekleme sorgusu oluşturulan (biliyor musunuz?

2 Cevap php

Sorun:

PHP Kodu (hayır çerçeve)

if ($this->uid)
        {
            $query = sprintf('UPDATE %sUSER SET USERNAME = "%s", ' .
                'PASSWORD = "%s", EMAIL_ADDR = "%s", IS_ACTIVE = %d ' .
                'WHERE USER_ID = %d',
                DB_TBL_PREFIX,
                mysql_real_escape_string($this->username, $GLOBALS['DB']),
                mysql_real_escape_string($this->password, $GLOBALS['DB']),
                mysql_real_escape_string($this->emailAddr, $GLOBALS['DB']),
                $this->isActive,
                $this->userId);
            mysql_query($query, $GLOBALS['DB']);
        }
        else
        {
            $query = sprintf('INSERT INTO %sUSER (USERNAME, PASSWORD, ' .
                'EMAIL_ADDR, IS_ACTIVE) VALUES ("%s", "%s", "%s", %d)',
                DB_TBL_PREFIX,
                mysql_real_escape_string($this->username, $GLOBALS['DB']),
                mysql_real_escape_string($this->password, $GLOBALS['DB']),
                mysql_real_escape_string($this->emailAddr, $GLOBALS['DB']),
                $this->isActive);
            mysql_query($query, $GLOBALS['DB']);

            $this->uid = mysql_insert_id($GLOBALS['DB']);
        }

Kohana Kodu (ORM kullanarak)

public function save()
    {
    	$query = ORM::factory('user', $this->user->uid);

    	if ($this->user->uid) :
    		$query->username = $this->user->username;
    		$query->password = $this->user->password;
    		$query->email_addr = $this->user->emailAddr;
    		$query->is_active = $this->user->isActive;
    	else:
               //????????

    }

Ben bir ekleme veya ORM gerçekleştirilen bir güncelleme olup olmadığını bile bilmiyorum aynı mysql_insert_id oluşturma hakkında gidecek? Veya son ekleme işleminin id bilmek için başka bir yol var mı?

2 Cevap

Ben Kohana hiç çalışmadık, ama diğer bazı ORM gibi çalışır eğer isimli bir ekleme yapmış zaman (I've used Doctrine a bit), sizin için otomatik olarak "id" olarak ayarlamanız gerekir:

  • "id" alanı kaydetmek için çalışıyoruz ne ayarlı ise, bu kayıt güncellemeniz gerekir
  • başka, yeni bir kayıt eklemek ve veritabanı tarafından döndürülen son eklenen kimliği ile "id" alanını olmalıdır.

Yani ORM yapsam bir ekleme veya güncelleştirme bilerek umurumda zorunda olmamalı: Eğer id Her halükarda almak (if insert, the ORM will set it from the DB ; if update, you'll know it before). olacak


For more informations, you might take a look at Creating New Records and Adding Related Records in One-to-Many Relationships, which states (quoting) :

The save() method sets the primary key of the object (usually id) to the last_insert_id.

Verilen örnekte, bu gibi görünüyor:

// create a new page record
$page = ORM::factory('page');
$page->title = "Test Page";
$page->content = "This is a test page";
$page->save();

// create a new keyword record for the page that was just created
$keyword = ORM::factory('keyword');
$keyword->name = "testing";
$keyword->page_id = $page->id;  // $page->id has the last insert id from the above save
$keyword->save();

$ Sayfa "id" özelliği otomatik olarak DB belirlendi: Bu konuda bakım gerekmez.

Kohana ORM lib Eğer kaydın durumunu belirlemek için kullanabileceğiniz iki özelliği sunar: $ yüklü ve $ kurtardı

Kayıt veritabanında varsa $loaded TRUE olarak ayarlanır ve kayıt veritabanı mevcut ve hiçbir kaydedilmemiş değişiklikler varsa, $saved TRUE olarak ayarlanır

Example for updating a record

// Assume I have 1 user in my database with id 3
$user = ORM::factory('user', 3);

// These will return TRUE
$user->loaded; // TRUE
$user->saved;  // TRUE

// However if we change one of the records attributes
$user->name = 'John';

// Then the changes have not been saved, so this returns FALSE
$user->saved;  // FALSE

// But the user was loaded from the database, so this returns TRUE
$user->loaded; // TRUE

// If I now save the changes
$user->save();

// Both will now return TRUE
$user->loaded; // TRUE
$user->saved;  // TRUE

Example for creating a record

// If I create a new user
$user = ORM::factory('user');
$user->name = 'Jack';

// The user has neither been loaded from the database, nor have the changes to it been saved
// So both variables will return FALSE
$user->loaded; // FALSE
$user->saved;  // FALSE

// If I now save the user, the changes have been saved and the record is present in the db
// So both variables return TRUE
$user->loaded; // TRUE
$user->saved;  // TRUE