web-dev-qa-db-fra.com

Quel est l'équivalent de getLastInsertId () dans Cakephp?

Si je fais getLastInsertId() immédiatement après une save(), cela fonctionne, mais sinon ce n'est pas le cas. Cela est démontré dans mon contrôleur:

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
}

Veuillez suggérer un moyen d'obtenir les fonctionnalités que je souhaite.

50
useranon

CakePHP a deux méthodes pour obtenir le dernier identifiant inséré: Model::getLastInsertID() et Model::getInsertID(). En fait, ces méthodes sont identiques, donc peu importe la méthode que vous utilisez.

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

Ces méthodes se trouvent dans cake/libs/model/model.php sur la ligne 2768

96
nask0

Utilisez simplement:

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

Dans Cake, le dernier identifiant d'insertion est automatiquement enregistré dans la propriété id du modèle. Donc, si vous venez d'insérer un utilisateur via le modèle utilisateur, le dernier identifiant d'insertion est accessible via $ User-> id

id - Valeur de l'ID de clé primaire de l'enregistrement vers lequel ce modèle pointe actuellement. Défini automatiquement après les insertions de base de données.

En savoir plus sur les propriétés du modèle dans les documents de l'API CakePHP: http://api.cakephp.org/2.5/class-AppModel.html

Edit: Je viens de réaliser que Model :: getLastInsertID () est essentiellement la même chose que Model-> id

Après avoir examiné votre code de plus près, il est difficile de dire exactement ce que vous faites avec les différentes fonctions et où elles existent dans le grand schéma des choses. Cela peut en fait être davantage un problème de portée. Essayez-vous d'accéder au dernier identifiant d'insertion dans deux demandes différentes?

Pouvez-vous expliquer le flux de votre demande et comment elle se rapporte à votre problème?

20
Mike B

Vous devrez faire une insertion (ou une mise à jour, je crois) pour que getLastInsertId() retourne une valeur. Pourriez-vous coller plus de code?

Si vous appelez cette fonction à partir d'une autre fonction de contrôleur, vous pouvez également utiliser $this->Form->id pour obtenir la valeur souhaitée.

9
inkedmn

c'est le meilleur moyen de trouver le dernier identifiant inséré.

$this->ModelName->getInsertID();

une autre façon utilise

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

Il existe plusieurs méthodes pour obtenir le dernier identifiant de clé primaire inséré lors de l'utilisation de la méthode save

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

Cela retournera le dernier identifiant inséré du modèle modèle actuel

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

Cela retournera le dernier identifiant inséré du modèle avec le nom de modèle donné

$this->Model->id;

Cela retournera le dernier identifiant inséré du dernier modèle chargé

$this->id;
8
Moyed Ansari

Essayez d'utiliser ce code dans votre classe de modèle (peut-être dans AppModel):

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

Caveat emptor: la fonction LAST_INSERT_ID () de MySql ne fonctionne que sur les tables avec un champ AUTO_INCREMENT (sinon elle ne renvoie que 0). Si votre clé primaire n'a pas l'attribut AUTO_INCREMENT, cela pourrait être la cause de vos problèmes.

6
Rick

Essayez d'utiliser ce code. essayez de le définir sur une variable afin de pouvoir l'utiliser dans d'autres fonctions. :)

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

en PHP natif, essayez ceci.

$variable = mysqli_insert_id();
6
r3mmel

Voici les options:

echo $this->Registration->id;

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

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

Ici, vous pouvez remplacer Registration par le nom de votre modèle.

Merci

4
Aditya P Bhatt

Cela retournera le dernier identifiant inséré du dernier modèle chargé

$this->id;

Cela retournera le dernier identifiant inséré du modèle avec le nom de modèle donné

$this->Model->id;

Cela retournera le dernier identifiant inséré du modèle modèle actuel

CakePHP a deux méthodes pour obtenir le dernier identifiant inséré: Model::getLastInsertID() et Model::getInsertID().

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

Chaque fois qu'une méthode save est appelée sur un modèle, cake appelle en interne Model :: getLastInsertId () et stocke le résultat dans l'ID d'attribut de classe de modèle, donc après avoir appelé save () il n'est pas nécessaire d'appeler Model :: getLastInsertId () ou inserId (), car cette valeur est directement accessible comme ceci

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

Lorsque vous utilisez save(), le dernier ID d'insertion est défini sur $id propriété. Alors:

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

Vous pouvez obtenir le dernier identifiant inséré de plusieurs façons. Comme le nom du modèle est Utilisateur, la meilleure façon de récupérer le dernier identifiant inséré est

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

Vous pouvez également utiliser la fonction Modèle mais le code ci-dessous renverra le dernier identifiant inséré du modèle avec le nom de modèle donné pour cet exemple, il renverra les données du modèle utilisateur

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

Utilisez celui-ci

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

}

3
vnpnlz

Après l'insertion des données, nous pouvons utiliser le code suivant pour obtenir l'ID de l'enregistrement récemment ajouté:

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

chaque fois que vous effectuez une opération d'insertion sur n'importe quel modèle, le gâteau récupère en interne le dernier identifiant d'insertion et définit l'attribut Model-> id.

donc on peut y accéder directement par $ Model-> id ;, pas besoin de relancer lastInsertId.

2
sumit

Je pense que cela fonctionne avec getLastInsertId() si vous utilisez des tables InnoDB dans votre base de données MySQL. Vous pouvez également utiliser $this->Model->id

2
Ammar

Dans CakePHP, vous pouvez l'obtenir par: Model :: getInsertID () // Renvoie l'ID du dernier enregistrement inséré par ce modèle. Model :: getLastInsertID () // Alias ​​de getInsertID ().

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

Manière la plus simple de trouver la dernière ligne insérée. Pour moi, getLastInsertId () cela ne fonctionne pas.

1
Sanjib Dhar

En fait, vous utilisez le getLastInsertId ou getInsertId d'une manière incorrecte. getLastInsertId () est censé fonctionner uniquement après la méthode save (). Cela ne fonctionnera même pas après une insertion manuelle, car le moteur de gâteau stocke le mysql_insert_id sous $ this -> _ insertID dans la méthode save qui peut être récupéré via getLastInsertId ou getInsertId. Maintenant dans ton cas

$this->Model->id

OR

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

Ça ira.

1
mithundas79

C'est intéressant, je suis aussi tombé sur cette question. Ce que vous avez demandé, peut-être, comment obtenir le dernier identifiant d'un certain modèle, quel que soit son état, qu'il soit simplement inséré ou non. Pour mieux comprendre ce que fait getInsertID, nous devons jeter un œil à la source:

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

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

Oui, c'est le seul morceau de code à l'intérieur de cette fonction. Cela signifie que cakephp met en cache tout dernier ID inséré, au lieu de le récupérer dans la base de données. C'est pourquoi vous n'obtenez rien si vous utilisez cette fonction alors que vous n'avez effectué aucune création d'enregistrement sur le modèle.

J'ai fait une petite fonction pour obtenir le dernier ID d'une certaine table, mais veuillez noter que cela ne doit pas être utilisé en remplacement de getLastID() ou getLastInsertID(), car il a un tout autre objectif.

Ajoutez la fonction lastID() à l'AppModel comme indiqué ci-dessous afin qu'elle puisse être utilisée à l'échelle du système. Il a sa limite, qui ne peut pas être utilisée sur un modèle avec une clé primaire composite.

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];
  }
}

Source d'origine: modèle de classe

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