web-dev-qa-db-ja.com

CakephpのgetLastInsertId()と同等のものは何ですか?

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
}

必要な機能を取得する方法を提案してください。

50
useranon

CakePHPには、最後に挿入されたIDを取得するための2つのメソッド、Model::getLastInsertID()Model::getInsertID()があります。実際、これらのメソッドは同一なので、どのメソッドを使用するかは問題ではありません。

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

このメソッドはcake/libs/model/model.php 2768行目

96
nask0

ただ使用する:

$this->Model->id;
29
s razu

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にアクセスしようとしていますか?

アプリケーションのフローと、それが問題にどのように関係しているか説明できますか?

20
Mike B

getLastInsertId()が値を返すためには、挿入(または更新、私は信じる)を行う必要があります。さらにコードを貼り付けていただけますか?

別のコントローラー関数からその関数を呼び出している場合、$this->Form->id必要な値を取得します。

9
inkedmn

これは、最後に挿入されたIDを見つける最良の方法です。

$this->ModelName->getInsertID();

他の方法は使用しています

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

Saveメソッドの使用中に最後に挿入された主キーIDを取得する方法はいくつかあります

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

これは、モデルの現在のモデルの最後に挿入されたIDを返します

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

これは、指定されたモデル名を持つモデルの最後に挿入されたIDを返します

$this->Model->id;

これは、最後にロードされたモデルの最後に挿入されたIDを返します

$this->id;
8
Moyed Ansari

モデルクラスで(おそらくAppModelで)このコードを使用してみてください。

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

注意事項:MySqlのLAST_INSERT_ID()関数はAUTO_INCREMENTフィールドを持つテーブルでのみ動作します(そうでない場合は0のみを返します)。主キーにAUTO_INCREMENT属性がない場合、それが問題の原因である可能性があります。

6
Rick

このコードを使用してみてください。他の関数で使用できるように、変数に設定してください。 :)

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

in PHP native、これを試してください。

$variable = mysqli_insert_id();
6
r3mmel

オプションは次のとおりです。

echo $this->Registration->id;

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

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

ここで、Registrationをモデル名に置き換えることができます。

ありがとう

4
Aditya P Bhatt

これは、最後にロードされたモデルの最後に挿入されたIDを返します

_$this->id;
_

これは、指定されたモデル名を持つモデルの最後に挿入されたIDを返します

_$this->Model->id;
_

これは、モデルの現在のモデルの最後に挿入されたIDを返します

CakePHPには、最後に挿入されたIDを取得するための2つのメソッド、Model::getLastInsertID()Model::getInsertID()があります。

_echo $this->ModelName->getInsertID();
echo $this->ModelName->getLastInsertID();
_
4
Gaurang P

Saveメソッドがモデルで呼び出されるたびに、cakeは内部でModel :: getLastInsertId()を呼び出し、結果をモデルクラス属性IDに保存します。したがって、save()を呼び出した後はModel :: getLastInsertId()またはinserIdを呼び出す必要はありません()、thaの値はこのように直接アクセスできるため

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

save()を使用すると、最後の挿入IDがモデルの$idプロパティ。そう:

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

最後に挿入されたIDはさまざまな方法で取得できます。モデル名はUserであるため、最後に挿入されたIDを取得する最良の方法は

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

Model関数を使用することもできますが、以下のコードは、この例で指定されたモデル名を持つモデルの最後に挿入されたIDを返し、ユーザーモデルデータを返します

$this->User->getLastInsertId();
$this->User->getInsertID();
3
user2610222

これを使って

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

}

3
vnpnlz

データの挿入後、次のコードを使用して、最近追加されたレコードのIDを取得できます。

    $last_insert_id=$this->Model->id;
2
Vineet Kumar

モデルで挿入操作を実行するたびに、cakeは内部で最後の挿入IDとSet to Model-> id属性をフェッチします。

そのため、$ Model-> idで直接アクセスできるため、lastInsertIdを再度クエリする必要はありません。

2
sumit

MySQLデータベースでInnoDBテーブルを使用する場合、getLastInsertId()で機能すると思います。 $this->Model->idも使用できます

2
Ammar

CakePHPでは、次の方法で取得できます。Model :: getInsertID()//このモデルが挿入した最後のレコードのIDを返します。 Model :: getLastInsertID()// getInsertID()のエイリアス。

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

最後に挿入された行を見つける最も簡単な方法。私にとってはgetLastInsertId()これは機能しません。

1
Sanjib Dhar

実際には、getLastInsertIdまたはgetInsertIdを間違った方法で使用しています。 getLastInsertId()は、save()メソッドの後でのみ機能することを意図しています。ケーキエンジンは、getLastInsertIdまたはgetInsertIdを介して取得できるsaveメソッド内の$ this-> _ insertIDの下にmysql_insert_idを格納しているため、手動挿入の後でも機能しません。今あなたの場合

$this->Model->id

OR

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

しましょう。

1
mithundas79

これは興味深いです、私もこの問題につまずいた。挿入されたばかりかどうかに関係なく、特定のモデルの状態に関係なく、特定のモデルの最後の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];
  }
}
_

元のソース:クラスモデル

1
Hendra Uzia
$this->Model->field('id', null, 'id DESC')
0
Robert