Как узнать, что метод ORM save () сгенерировал обновление или запрос на вставку? - PullRequest
1 голос
/ 10 августа 2009

Проблема:

PHP-код (без фреймворка)

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 (с использованием ORM)

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:
               //????????

    }

Пойду ли я создать такой же mysql_insert_id, когда я даже не знаю, была ли это вставка или обновление, выполненное ORM? Или есть другой способ узнать идентификатор последней операции вставки?

Ответы [ 2 ]

3 голосов
/ 10 августа 2009

Я никогда не работал с Kohana, но если он работает как какой-то другой ORM (я немного использовал Doctrine) , он должен автоматически установить "id" для вас, когда он сделал вставить:

  • если поле «id» установлено в том, что вы пытаетесь сохранить, оно должно обновить запись
  • иначе, он должен вставить новую запись и установить поле "id" с последним вставленным id, возвращенным базой данных.

Так что вам не нужно беспокоиться о том, что ORM выполнил вставку или обновление: вы в любом случае получите идентификатор (если вставка, ORM установит его из БД; при обновлении вы знаю это раньше).


Для получения дополнительной информации вы можете взглянуть на Создание новых записей и Добавление связанных записей в отношениях «один ко многим» , в котором говорится (цитирование):

Метод save() устанавливает первичный ключ объекта (обычно id) в last_insert_id.

Данный пример выглядит так:

// 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();

Свойство "id" для $ page было установлено из БД автоматически: вам не нужно об этом заботиться.

2 голосов
/ 13 августа 2009

Библиотека Kohana ORM предоставляет два свойства, которые можно использовать для определения статуса записи: $ загружен и $ сохранен

$loaded установлен в TRUE, если запись присутствует в базе данных, и $saved установлен в TRUE, если запись присутствует в базе данных и не имеет несохраненных изменений

Пример обновления записи

// 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

Пример создания записи

// 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
...