2009-06-11 100 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

感謝

相關問題