getLastInsertId()
の直後にsave()
を実行すると動作しますが、それ以外の場合は動作しません。これは私のコントローラーで示されています:
function designpage() {
//to create a form Untitled
$this->Form->saveField('name','Untitled Form');
echo $this->Form->getLastInsertId(); //here it works
}
function insertformname() {
echo $this->Form->getLastInsertId(); //this doesnt echo at all
}
必要な機能を取得する方法を提案してください。
CakePHPには、最後に挿入されたIDを取得するための2つのメソッド、Model::getLastInsertID()
とModel::getInsertID()
があります。実際、これらのメソッドは同一なので、どのメソッドを使用するかは問題ではありません。
echo $this->ModelName->getInsertID();
echo $this->ModelName->getLastInsertID();
このメソッドはcake/libs/model/model.php
2768行目
ただ使用する:
$this->Model->id;
Cakeでは、最後の挿入IDはモデルのidプロパティに自動的に保存されます。したがって、ユーザーモデルを介してユーザーを挿入した場合、最後の挿入IDは$ User-> idを介してアクセスできます。
id-このモデルが現在指しているレコードの主キーIDの値。データベースの挿入後に自動的に設定されます。
CakePHP APIドキュメントのモデルプロパティの詳細を参照してください: http://api.cakephp.org/2.5/class-AppModel.html
編集:Model :: getLastInsertID()は本質的にModel-> idと同じであることに気付きました
コードをより詳しく見てみると、さまざまな関数で何をしているのか、そしてそれらが物事の大規模なスキームのどこに存在するのかを正確に知ることは困難です。これは実際には、よりスコープの問題かもしれません。 2つの異なるリクエストで最後の挿入IDにアクセスしようとしていますか?
アプリケーションのフローと、それが問題にどのように関係しているか説明できますか?
getLastInsertId()
が値を返すためには、挿入(または更新、私は信じる)を行う必要があります。さらにコードを貼り付けていただけますか?
別のコントローラー関数からその関数を呼び出している場合、$this->Form->id
必要な値を取得します。
これは、最後に挿入されたIDを見つける最良の方法です。
$this->ModelName->getInsertID();
他の方法は使用しています
$this->ModelName->find('first',array('order'=>'id DESC'))
Saveメソッドの使用中に最後に挿入された主キーIDを取得する方法はいくつかあります
$this->loadModel('Model');
$this->Model->save($this->data);
これは、モデルの現在のモデルの最後に挿入されたIDを返します
$this->Model->getLastInsertId();
$this->Model-> getInsertID();
これは、指定されたモデル名を持つモデルの最後に挿入されたIDを返します
$this->Model->id;
これは、最後にロードされたモデルの最後に挿入されたIDを返します
$this->id;
モデルクラスで(おそらくAppModelで)このコードを使用してみてください。
function get_sql_insert_id() {
$db =& ConnectionManager::getDataSource($this->useDbConfig);
return $db->lastInsertId();
}
注意事項:MySqlのLAST_INSERT_ID()関数はAUTO_INCREMENTフィールドを持つテーブルでのみ動作します(そうでない場合は0のみを返します)。主キーにAUTO_INCREMENT属性がない場合、それが問題の原因である可能性があります。
このコードを使用してみてください。他の関数で使用できるように、変数に設定してください。 :)
$variable = $this->ModelName->getLastInsertId();
in PHP native、これを試してください。
$variable = mysqli_insert_id();
オプションは次のとおりです。
echo $this->Registration->id;
echo $this->Registration->getInsertID();
echo $this->Registration->getLastInsertId();
ここで、Registration
をモデル名に置き換えることができます。
ありがとう
これは、最後にロードされたモデルの最後に挿入されたIDを返します
_$this->id;
_
これは、指定されたモデル名を持つモデルの最後に挿入されたIDを返します
_$this->Model->id;
_
これは、モデルの現在のモデルの最後に挿入されたIDを返します
CakePHPには、最後に挿入されたIDを取得するための2つのメソッド、Model::getLastInsertID()
とModel::getInsertID()
があります。
_echo $this->ModelName->getInsertID();
echo $this->ModelName->getLastInsertID();
_
Saveメソッドがモデルで呼び出されるたびに、cakeは内部でModel :: getLastInsertId()を呼び出し、結果をモデルクラス属性IDに保存します。したがって、save()を呼び出した後はModel :: getLastInsertId()またはinserIdを呼び出す必要はありません()、thaの値はこのように直接アクセスできるため
$id = $this->id;// within a model
$id = $this->{$this->modelName}->id;// in a controller
save()
を使用すると、最後の挿入IDがモデルの$id
プロパティ。そう:
if ($this->Model->save()) {
printf('Last insert ID was %s', $this->Model->id);
}
最後に挿入されたIDはさまざまな方法で取得できます。モデル名はUserであるため、最後に挿入されたIDを取得する最良の方法は
$this->User->id; // For User Model
Model関数を使用することもできますが、以下のコードは、この例で指定されたモデル名を持つモデルの最後に挿入されたIDを返し、ユーザーモデルデータを返します
$this->User->getLastInsertId();
$this->User->getInsertID();
これを使って
function designpage() {
//to create a form Untitled
$this->Form->saveField('name','Untitled Form');
echo $this->Form->id; //here it works
}
データの挿入後、次のコードを使用して、最近追加されたレコードのIDを取得できます。
$last_insert_id=$this->Model->id;
モデルで挿入操作を実行するたびに、cakeは内部で最後の挿入IDとSet to Model-> id属性をフェッチします。
そのため、$ Model-> idで直接アクセスできるため、lastInsertIdを再度クエリする必要はありません。
MySQLデータベースでInnoDBテーブルを使用する場合、getLastInsertId()
で機能すると思います。 $this->Model->id
も使用できます
CakePHPでは、次の方法で取得できます。Model :: getInsertID()//このモデルが挿入した最後のレコードのIDを返します。 Model :: getLastInsertID()// getInsertID()のエイリアス。
$Machinedispatch =
$this->Machinedispatch->find('first',array('order'=>array('Machinedispatch.id DESC')));
最後に挿入された行を見つける最も簡単な方法。私にとってはgetLastInsertId()これは機能しません。
実際には、getLastInsertIdまたはgetInsertIdを間違った方法で使用しています。 getLastInsertId()は、save()メソッドの後でのみ機能することを意図しています。ケーキエンジンは、getLastInsertIdまたはgetInsertIdを介して取得できるsaveメソッド内の$ this-> _ insertIDの下にmysql_insert_idを格納しているため、手動挿入の後でも機能しません。今あなたの場合
$this->Model->id
OR
$this->Model->find('first',array('order'=>'id DESC'))
しましょう。
これは興味深いです、私もこの問題につまずいた。挿入されたばかりかどうかに関係なく、特定のモデルの状態に関係なく、特定のモデルの最後のIDを取得する方法をたぶん尋ねました。 getInsertID
の機能をさらに理解するには、ソースを確認する必要があります。
リンク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];
}
}
_
$this->Model->field('id', null, 'id DESC')