2015-04-23 1 views
2

Я довольно новичок в CakePHP и имею проблему с получением последнего вставленного id. Моя схема выглядит следующим образом:CakePHP getLastInsertId() возвращает ноль

CREATE TABLE IF NOT EXISTS `markets` (
    `id` int(11) NOT NULL, 
    `name` varchar(20) NOT NULL, 
    `region_code` varchar(5) NOT NULL, 
    `country_code` varchar(255) NOT NULL, 
    `language` varchar(255) NOT NULL, 
    `default_language` varchar(10) NOT NULL, 
    `created` datetime NOT NULL, 
    `modified` datetime NOT NULL 
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8; 

ALTER TABLE `markets` 
    ADD PRIMARY KEY (`id`), 
    ADD UNIQUE KEY `region_code` (`region_code`), 
    ADD KEY `locale` (`country_code`), 
    ADD KEY `language` (`language`); 

ALTER TABLE `markets` 
    MODIFY `id` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=8; 

И это моя логика:

$this->loadModel('Market'); 
if(isset($this->request->data['Market'])) { 
    $this->Market->set($this->request->data); 
    if($this->Market->validates()) { 
    $this->Market->save($this->request->data); 
    echo $this->Market->id; //displays zero 
    echo $this->Market->getLastInsertID(); //also displays zero 
    } 
} 

Это все хорошо выглядит в MySQL, хотя, как идентификатор получает автоматически увеличивается там, как это должно быть.

P.S. Я просто вставить другую запись, и вот что вернулся:

array (size=1) 
    'Market' => 
    array (size=8) 
     'name' => string 'Japan' (length=5) 
     'region_code' => string 'JP' (length=2) 
     'country_code' => string 'JP' (length=2) 
     'language' => string 'ja_JP' (length=5) 
     'default_language' => string 'ja_JP' (length=5) 
     'modified' => string '2015-04-23 09:11:34' (length=19) 
     'created' => string '2015-04-23 09:11:34' (length=19) 
     'id' => string '0' (length=1) 

Here's the saved data in phpMyAdmin

Итак, сейчас я просто добавил функцию под названием «getMarketLastInsertId» к модели рынка, которая принимает «country_code» (уникальный ключ таблицу) в качестве параметра и возвращает последний идентификатор ... Благодарности

+1

вы можете попробовать $ this-> ModelName-> getInsertID(); – Enjoyted

+0

$ this-> Market-> getInsertId(); также возвращает нуль – petermk

+0

Правильно ли вы построили массив для сохранения в базе данных? Вы не проверяете, что сохранение завершено успешно –

ответ

1

В CakePHP 3.xx вы можете сделать, как это

$result = $this->Market->save($this->request->data); 
$record_id=$result->id; 

Более общие

$result=$this->ModelName->save($whatever); 
$record_id=$result->id; 

Для Подробнее

http://book.cakephp.org/3.0/en/orm/saving-data.html#a-glance-over-saving-data http://book.cakephp.org/3.0/en/orm/saving-data.html#saving-entities

+0

К сожалению, это не 3,0. Это 2.5.4 – petermk

+0

Насколько я знаю, этот код должен работать на CakePHP 2.X тоже –

+0

@petermk у меня вставлены ссылки из официального руководства 3.0. надеюсь, что помогает –

2

В заявлении создания таблицы вы показали

`id` int(11) NOT NULL, 

должно быть на самом деле

`id` int(11) NOT NULL AUTO_INCREMENT, 

для id должно быть полем автоматического приращения. Поэтому я сомневаюсь в ваших претензиях на заполнение поля значениями автоматического увеличения.

+1

Хм, я уже более 10 лет использую MySQL и знаю, как использовать phpMyAdmin. Значения сохраняются и автоматически увеличиваются. Спасибо. – petermk

+3

@petermk Даже опытные пользователи могут ошибаться. ADmad прав, эта схема не будет автоматически увеличиваться. См. Доказательство здесь: http://i.imgur.com/cE8dzEP.png – Oldskool

+0

OP первое сообщение ясно показывает, что он работает так, как должно было ... – Enjoyted

0

У вас нет первичного ключа, установленного правильно. У вас должно быть NOT NULL и AUTO_INCREMENT, примененное к вашему столбцу id, а также определение его как первичного ключа.

+0

Вы пропустили это: ALTER TABLE 'markets' MODIFY' id' int (11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT = 8; – petermk