1

问题:

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

    }

当我什至不知道它是 ORM 执行的插入还是更新时,我会继续创建相同的 mysql_insert_id 吗?还是有另一种方法可以知道最后一次插入操作的 id?

4

2 回答 2

3

我从未与 Kohana 合作过,但如果它像其他 ORM 一样工作(我使用过一点 Doctrine),它应该在完成插入时自动为您设置“id”:

  • 如果在您尝试保存的内容中设置了“id”字段,它应该更新记录
  • 否则,它应该插入一条新记录,并使用数据库返回的最后插入的 id 设置“id”字段。

因此,您不必关心 ORM 是否进行了插入或更新:无论哪种方式,您都会获得 id (如果插入,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();

$page 的“id”属性已从数据库自动设置:您不必关心这一点。

于 2009-08-10T04:23:50.727 回答
2

Kohana ORM 库公开了两个属性,您可以使用它们来确定记录的状态:$loaded 和 $saved

$loaded如果记录存在于数据库中,$saved则设置为 TRUE,如果记录存在于数据库中并且没有未保存的更改,则设置为 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
于 2009-08-12T21:14:46.063 回答