Получение последнего идентификатора пользователя в Zend Framework
Используя браузер запросов MySQL, я вручную создал таблицу users
и введите некоторую дату в полях. Я установил primary key
в id
и установите его auto increment
, Есть 3 rows
, самый высокий id
является 3
,
Затем я сделал следующее class
в method
каталог для вызова данных в таблице и т. д.
class Application_Model_DbTable_User extends Zend_Db_Table_Abstract
{
protected $_name = 'user';
public function getLatestUserId()
{
$id = $this->getAdapter()->lastInsertId();
return $id;
}
}
в controller
Я делаю следующее, которое получает значение, сгенерированное method
и позволяет view
получить доступ к нему:
$usersDbModel = new Application_Model_DbTable_User();
$lastUserId = $usersDbModel->getLatestUserId();
$this->view->lastUserId = $lastUserId;
В представлении я затем отображаю его для отображения пользователю:
echo $this->lastUserId;
Тем не менее, хотя мой последний id
в users
Таблица 3. Показывает 0.
Я также попробовал:
public function getLatestUserId()
{
$sql = 'SELECT max(id) FROM user';
$query = $this->query($sql);
$result = $query->fetchAll();
return $result;
}
Но это просто выдает ошибку сервера.
Что я сделал не так?
Я что-то пропустил?
Есть ли другой способ сделать это?
4 ответа
Ответ был:
$sql = 'SELECT max(id) FROM user';
$query = $this->getAdapter()->query($sql);
$result = $query->fetchAll();
return $result[0]['max(id)'];
Если вы запросили, как "ВЫБЕРИТЕ id ИЗ ПОЛЬЗОВАТЕЛЕЙ СОРТИРОВАТЬ ПО ID DESC LIMIT 0,1"
Вы бы получили только идентификатор нового пользователя, нет?
Если вы используете оператор выбора, как
SELECT max(id) FROM USERS;
Если вы еще не пробовали использовать функцию в контроллере, попробуйте что-то вроде этого.
class IndexController extends Zend_Controller_Action {
public function init() {
}
public function indexAction() {
}
public function getLatestUserId()
{
$bootstrap = $this->getInvokeArg('bootstrap');
$resource = $bootstrap->getPluginResource('db');
$db = $resource->getDbAdapter();
$sqlrequest = "select max(id) as Idmax from user";
$rows = $db->fetchAll($sqlrequest);
foreach ($rows as $row)
echo $maxId = $row['Idmax'];
return $maxId;
}
}
и ваш файл начальной загрузки будет выглядеть примерно так
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
protected function _initConfig()
{
$config = new Zend_Config($this->getOptions());
Zend_Registry::set('config', $config);
return $config;
}
}
Надеюсь, что-то подобное сработает, надеюсь, это помогло
Проблема в том, что Mysql на самом деле не поддерживает lastInsertId()
в некоторых случаях он возвращает последний идентификатор автоматически увеличивающегося первичного ключа.
Здесь представлено несколько решений, и большинство из них будет возвращать последний идентификатор первичного ключа, который может или не может быть тем, что вам действительно нужно.
Этот метод также сделает то же самое, используя объект select().
public function getlastInsertId(){
$select = $this->select();
$select->from($this->_name, "id");
$select->order('id DESC');
$select->limit(0, 1);
$result = $this->fetchAll($select)->current();
return $result->id;
}
Я думаю, что со временем вы можете найти эти методы ненадежными, если то, что вы действительно ищете, является последним идентификатором, который вы вставили. Со временем, когда записи добавляются и удаляются, база данных может заполнять или не заполнять пустые идентификаторы в зависимости от того, какую базу данных вы используете в данный момент и как эта база данных настроена.
В большинстве случаев нам нужен идентификатор последнего элемента, вставленного очень скоро после его вставки, обычно для обновления скрипта вида. В этом случае я обычно просто делаю весь объект строки частью возвращаемого значения.
Вот пример того, что я имею в виду:
/**this method will save or update a record depending on data present in the array*/
public function saveUser(array $data) {
/**cast data array as std object for convience*/
$dataObject = (object) $data;
/**if id exists as array and has a non null value*/
if (array_key_exists('id', $data) && isset($data['id'])) {
/**find row if updating*/
$row = $this->find($dataObject->id)->current();
} else {
/**create new row*/
$row = $this->createRow();
}
$row->first_name = $dataObject->first_name;
$row->last_name = $dataObject->last_name;
$row->email = $dataObject->email;
/**save or update row*/
$row->save();
/**return the $row you just built or you can return $result = $row->save(); and get*/
/** just the primary key. Save() will throw an exception if table is marked read only*/
return $row;
}