2009-06-11 20 views
47

Si hago getLastInsertId() inmediatamente después de save(), funciona, pero de lo contrario no funciona. Esto se demuestra en mi regulador:¿Cuál es el equivalente a getLastInsertId() en Cakephp?

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 
} 

Para sugerir una manera de conseguir la funcionalidad que quiero.

+1

Si desea utilizar el ID de inserción en un método diferente, entonces tendrá que almacenarlo en algún lugar, es decir, una sesión o como una propiedad de clase en su controlador si una parte de la misma petición. –

Respuesta

9

Deberá hacer una inserción (o actualizar, creo) para que getLastInsertId() devuelva un valor. ¿Podrías pegar más código?

Si llama a esa función desde otra función del controlador, también puede usar $this->Form->id para obtener el valor que desea.

+0

En mi página de inicio, si hago clic en la página de diseño, crearé de forma predeterminada una entrada de formulario. Después de tat en mi página de diseño, quiero cambiar mi nombre de formulario, utilizando la función Insertformname para actualizar el nombre ... Para esto necesito la identificación. .... – useranon

+0

Ack. Suponiendo que designpage() y insertformname() son dos acciones diferentes en un controlador, no habrá lastInsertId en la acción insertformname() ya que no ha realizado ninguna inserción de base de datos en esta acción. Cada acción (leer: solicitud de página) es autocontenida, no puede obtener insertIds de una solicitud de página anterior. – deceze

18

En Cake, la última identificación de inserción se guarda automáticamente en la propiedad id del modelo. Así que si usted acaba de insertar un usuario a través del modelo de usuario, la última Identificación del inserto se podía acceder a través de $ usuario-> Identificación del

id - Valor del identificador de clave principal de el registro que este modelo es actualmente apuntando a. Automáticamente se establece después de las inserciones de la base de datos.

Leer más acerca del modelo en la documentación de la API de CakePHP: http://api.cakephp.org/2.5/class-AppModel.html

Edit: acabo de dar cuenta que el Modelo :: getLastInsertID() es esencialmente el mismo que Modelo-> Identificación del

Después de mirar En su código más de cerca, es difícil decir exactamente qué está haciendo con las diferentes funciones y dónde existen en el gran esquema de cosas. Esto en realidad puede ser más un problema de alcance. ¿Estás intentando acceder al último id de inserción en dos solicitudes diferentes?

¿Puede explicar el flujo de su aplicación y cómo se relaciona con su problema?

+0

dentro de mi nombre de formulario de inserción, necesito actualizar el nombre de formulario con el último ID de formulario insertado ... – useranon

+0

¿Por qué Cake ofrece dos formas de acceder al valor? Seguramente la razón no es realmente sembrar las semillas de la confusión. –

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

Este enfoque es incorrecto ... Eventualmente ocurrirá que obtenga una identificación de una fila insertada entre la creación de su modelo y esta llamada. Use getLastInsertID(); – Elwhis

25

sólo tiene que utilizar:

$this->Model->id; 
+1

He intentado esto y funciona perfectamente. –

6

Trate de usar este código en la clase del modelo (tal vez en AppModel):

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

caveat.emptor: de MySQL LAST_INSERT_ID() función sólo funciona en tablas con un campo AUTO_INCREMENT (de lo contrario, solo devuelve 0). Si su clave principal no tiene el atributo AUTO_INCREMENT, esa podría ser la causa de sus problemas.

+2

Esto funcionará para una consulta de inserción de consulta personalizada (creada manualmente). – Strixy

92

CakePHP tiene dos métodos para obtener la última identificación insertada: Model::getLastInsertID() y Model::getInsertID(). En realidad, estos métodos son idénticos, por lo que realmente no importa qué método use.

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

Estos métodos se pueden encontrar en cake/libs/model/model.php en la línea 2768

+15

Esta función no funciona si ejecuta manualmente la consulta de inserción – Webnet

+0

Consulte la respuesta de Rick del 3 de septiembre de 2010 a las 0:02 para obtener la última identificación de inserción para una consulta de inserción personalizada. – Strixy

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

La manera más sencilla de encontrar la última fila insertada. Para mí getLastInsertId() esto no funciona.

8

Hay varias maneras de que la última insertada Identificación clave primaria durante el uso de método para guardar las

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

Esto devolverá última insertada Identificación del modelo actual modelo

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

Esto devolverá última insertada Identificación del modelo con el nombre del modelo dado

$this->Model->id; 

Esto le devolverá el último insertado id del último modelo cargado

$this->id; 
1

Esto es interesante, también me encontré con este problema. Lo que preguntaste quizás fue cómo obtener la última identificación de un determinado modelo, independientemente de su estado, ya sea que se haya insertado o no. Para entender mejor lo que hace getInsertID, tenemos que echar un vistazo a la fuente:

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

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

Sí, esa es la única pieza de código dentro de esa función. Significa que cakephp guarda en caché cualquier último ID insertado, en lugar de recuperarlo de la base de datos. Es por eso que no obtiene nada si usa esa función cuando no ha realizado ninguna creación de registro en el modelo.

Hice una pequeña función para obtener la última identificación de una determinada tabla, pero tenga en cuenta que esto no debe utilizarse como un reemplazo de getLastID() o getLastInsertID(), ya que tiene un propósito completamente diferente.

Agregue la función lastID() al AppModel como se muestra a continuación para que pueda usarse en todo el sistema. Tiene su límite, que no se puede usar en el modelo con clave primaria compuesta.

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

Uso éste

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

}

+1

No estoy seguro de que fuera realmente necesario calentar una pregunta antigua y volver a publicar una respuesta que ya se ha dado. – mark

2

Después de la inserción de los datos, podemos utilizar la siguiente código para obtener recientemente añadido Identificación del registro:

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

Usted puede obtener la última Identificación inseted con el nombre de muchos ways.Like Modelo es usuario de modo mejor manera de buscar el último ID insertado se

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

También puede utilizar la función de modelo, pero por debajo de código volverá última insertada Identificación del modelo con dado nombre del modelo para este ejemplo se volverá datos del modelo de usuario

$this->User->getLastInsertId(); 
$this->User->getInsertID(); 
2

cada vez que se realiza una operación de inserción en cualquier modelo, pastel internamente fetchesthe última ID de inserción y se pone a Modelo-> atributo id.

por lo que se puede acceder directamente por $ Model-> id ;, sin necesidad de consultar de nuevo para lastInsertId.

3

Cuando usa save(), la última ID de inserción se establece en la propiedad $id del modelo. Por lo tanto:

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

Cada vez que un método save se llama en un modelo, pastel de llama internamente Modelo :: getLastInsertId() y almacena el resultado en la clase del modelo atributo id, así que después de llamar a save() no es necesario llamar Modelo :: getLastInsertId() o inserId(), como tha valor se puede acceder directamente como esto

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

esta es la mejor manera de descubrir el pasado inserta ID.

$this->ModelName->getInsertID(); 

otra forma es utilizar

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

su "otra manera" no obtendrá la ID correcta si hay más de una persona que usa su interfaz – Tamar

1

realidad está utilizando el getLastInsertId o getInsertId de una manera equivocada. getLastInsertId() debe funcionar solo después del método save(). Incluso no funcionará después de una inserción manual, ya que Cake Engine está almacenando mysql_insert_id en $ this -> _ insertID dentro del método save que se puede recuperar a través de getLastInsertId o getInsertId. Ahora en su caso

$this->Model->id 

O

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

hará.

4

Este id volverá última insertada del último modelo cargado

$this->id; 

Esto devolverá última inserta Identificación del modelo con el nombre del modelo dado

$this->Model->id; 

Esto devolverá última insertada Identificación del actual modelo modelo

CakePHP tiene dos métodos para obtener la última identificación insertada: Model::getLastInsertID() y Model::getInsertID().

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

En CakePHP lo puede conseguir por: Modelo :: getInsertID() // Devuelve el ID del último registro insertado este modelo. Modelo :: getLastInsertID() // Alias ​​a getInsertID().

2

Creo que funciona con getLastInsertId() si utiliza tablas InnoDB en su base de datos MySQL. También puede usar $this->Model->id

6

Intente utilizar este código. intente configurarlo en una variable para que pueda usarlo en otras funciones. :)

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

en PHP nativo, inténtalo de nuevo.

$variable = mysqli_insert_id(); 
4

A continuación se presentan las opciones:

echo $this->Registration->id; 

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

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

Aquí, se puede reemplazar Registration con el nombre del modelo.

Gracias

Cuestiones relacionadas