2009-06-11 59 views
47

如果我在save()之后立即执行getLastInsertId(),它就可以工作,但否则它不会。这是我的控制器演示:CakePHP中的getLastInsertId()等价于什么?

​​

请建议一种方法来获得我想要的功能。

+1

如果你想使用插件ID在不同的方法,那么你就需要将它存储了一些地方,即会话或在你的控制器类财产,如果同样的请求的一部分。 – 2013-09-27 08:39:40

回答

9

为了让getLastInsertId()返回一个值,您需要插入(或更新,我相信)。你能粘贴更多的代码吗?

如果您从另一个控制器功能调用该功能,您可能也可以使用$this->Form->id来获取所需的值。

+0

在我的主页,如果我点击designpage,默认情况下会创建一个表单条目..在我的设计页面的后,我想改变我的表单名称那里使用函数insertformname更新名称...为此,我需要它的ID .... – useranon 2009-06-11 07:17:37

+0

Ack。假设designpage()和insertformname()是Controller中的两个不同的Actions,insertformname()Action中将不会有lastInsertId,因为您没有在此操作中执行任何数据库插入操作。每个Action(读取:页面请求)都是自包含的,您无法从前一个页面请求获取insertIds。 – deceze 2009-06-23 08:42:29

18

在Cake中,最后一个插入ID会自动保存在模型的id属性中。所以,如果你只是通过用户模型插入用户,最后插入的ID可以通过$用户 - > ID

ID访问 - 的 主键ID的记录,这种模式的价值 当前指向至。数据库插入后自动设置 。

了解更多关于CakePHP的API文档模特属性:http://api.cakephp.org/2.5/class-AppModel.html

编辑:我刚刚意识到型号:: getLastInsertID()本质上是作为型号 - 同样的事情> ID

细算在你的代码中,你很难准确地分辨出你在使用不同的函数以及它们存在于宏伟事物中的方式。这实际上可能更多是一个范围问题。你是否试图在两个不同的请求中访问最后一个插入ID?

您能解释一下应用程序的流程以及它与您的问题之间的关系吗?

+0

在我的insertformname里面,我需要用最后插入的表单ID来更新表单名称...... – useranon 2009-06-12 06:22:08

+0

为什么Cake会给出两种访问值的方法?原因实际上并不是播下混乱的种子。 – 2015-05-14 18:55:53

0
$this->Model->field('id', null, 'id DESC') 
+4

这种方法是错误的......最终它会发生,你得到一行插入你的模型创建和这个调用之间的行的id。使用getLastInsertID(); – Elwhis 2011-05-06 00:19:50

25

只需使用:

$this->Model->id; 
+1

我试过这个,它完美的作品。 – 2015-05-04 20:31:49

6

尝试在你的模型类(也许在AppModel)使用此代码:

function get_sql_insert_id() { 
    $db =& ConnectionManager::getDataSource($this->useDbConfig); 
    return $db->lastInsertId(); 
} 

买者自负:MySQL的LAST_INSERT_ID()函数只能在表带有AUTO_INCREMENT字段(否则它只返回0)。如果你的主键没有AUTO_INCREMENT属性,那可能是你问题的原因。

+2

这将适用于自定义查询(手动创建)插入查询。 – Strixy 2014-02-19 21:54:05

92

CakePHP有两种获取最后插入的ID的方法:Model::getLastInsertID()Model::getInsertID()。 其实这些方法是相同的,所以你使用哪种方法确实无关紧要。

echo $this->ModelName->getInsertID(); 
echo $this->ModelName->getLastInsertID(); 

这种方法可以在cake/libs/model/model.php找到上线2768

+15

如果您手动运行插入查询,此功能不起作用 – Webnet 2012-06-20 13:21:24

1
$Machinedispatch = 
    $this->Machinedispatch->find('first',array('order'=>array('Machinedispatch.id DESC'))); 

找到最后插入的行的最简单方式。对于我getLastInsertId()这不起作用。

8

有几种方法来获得最后插入的主键ID,而使用Save方法

$this->loadModel('Model'); 
$this->Model->save($this->data); 

这将返回最后插入模型当前模型

$this->Model->getLastInsertId(); 
$this->Model-> getInsertID(); 

这将返回的ID最后插入的ID给定型号名称的型号

$this->Model->id; 

这将返回上次插入上次加载模型的ID

$this->id; 
1

这很有趣,我也偶然发现了这个问题。你可能会问如何得到某个模型的最后一个ID,而不管它是否被插入。为了进一步了解getInsertID呢,我们需要看一看来源:

Link 1: http://api20.cakephp.org/view_source/model#line-3375

public function getInsertID() { 
    return $this->_insertID 
} 

是啊,这是的代码函数内唯一的一块。这意味着cakephp会缓存最后插入的ID,而不是从数据库中检索它。这就是为什么当你没有在模型上创建任何记录时,如果使用该功能,你什么也得不到。

我做了一个小函数来获取某个表的最后一个ID,但请注意,这不应该用作getLastID()getLastInsertID()的替代,因为它具有完全不同的目的。

将函数lastID()添加到AppModel,如下所示,以便它可以在系统范围内使用。它有它的限制,它不能用于具有复合主键的模型。

class AppModel extends Model { 
    public function lastID() { 
    $data = $this->find('first', 
     array(
     'order' => array($this->primaryKey . ' DESC'), 
     'fields' => array($this->primaryKey) 
    ) 
    ); 

    return $data[$this->name][$this->primaryKey]; 
    } 
} 

Original Source : Class Model

3

使用这一个

function designpage() { 
//to create a form Untitled 
$this->Form->saveField('name','Untitled Form'); 
echo $this->Form->id; //here it works 

}

2

数据的插入之后,我们可以使用下面的代码获取最近添加记录的ID:

$last_insert_id=$this->Model->id; 
3

你可以得到最后inseted ID与许多ways.Like型号名称是用户所以最好的方式来获取最后插入的ID是

$this->User->id; // For User Model 

您还可以使用型号功能,但下面的代码将返回最后插入模式与ID在这个例子中,它将返回用户模型数据

$this->User->getLastInsertId(); 
$this->User->getInsertID(); 
2
每次上任何模型执行插入操作时间

,蛋糕内部fetchesthe最后插入ID,然后设置到模型 - > id属性给出的型号名称。

所以人们可以直接通过$ Model-> id; 来访问它,不需要再次查询lastInsertId。

3

当您使用save()时,最后一个插入ID被设置为模型的$id属性。所以:

if ($this->Model->save()) { 
    printf('Last insert ID was %s', $this->Model->id); 
} 
3

每次保存方法被调用的模型,蛋糕内部调用型号:: getLastInsertId(),并将结果存储到模型类属性ID,所以调用save()后,没有必要呼叫模型:: getLastInsertId()或inserId(),作为THA值可以这样

$id = $this->id;// within a model 
$id = $this->{$this->modelName}->id;// in a controller 
8

这可以直接访问是要找出最好的办法最后插入的ID。

$this->ModelName->getInsertID(); 

其它方式使用

$this->ModelName->find('first',array('order'=>'id DESC')) 
1

其实你正在使用的getLastInsertId或getInsertId以错误的方式。 getLastInsertId()仅用于save()方法后才起作用。 手动插入后它甚至不起作用,因为Cake引擎正在将$ this - > _ insertID存储在可通过getLastInsertId或getInsertId检索的save方法内的mysql_insert_id。 现在你的情况

$this->Model->id 

OR

$this->Model->find('first',array('order'=>'id DESC')) 

就行了。

4

这将返回最后插入最后加载的模型的ID

$this->id; 

这将返回最后插入模型的ID与给定的型号名称

$this->Model->id; 

这将返回最后插入模型当前的ID模型

CakePHP有两种获取最后插入的ID的方法: Model::getLastInsertID()Model::getInsertID()。 型号:: getInsertID()//返回此模型插入的最后一条记录的ID:

echo $this->ModelName->getInsertID(); 
echo $this->ModelName->getLastInsertID(); 
1

在CakePHP你可以得到它。 Model :: getLastInsertID()//别名为getInsertID()。

2

我认为它适用于getLastInsertId()如果你在你的MySQL数据库中使用InnoDB表。您也可以使用$this->Model->id

6

请尝试使用此代码。尝试将其设置为一个变量,以便您可以在其他函数中使用它。 :)

$variable = $this->ModelName->getLastInsertId(); 

在PHP本地,试试这个。

$variable = mysqli_insert_id(); 
4

下面是选项:

echo $this->Registration->id; 

echo $this->Registration->getInsertID(); 

echo $this->Registration->getLastInsertId(); 

在这里,您可以与您的型号名称替换Registration

感谢

相关问题