Yii - 获取自动增量ID

时间:2014-10-23 07:57:24

标签: php yii

我希望从我的数据库中获取自动增量ID并在我的控制器内调用。

' id' db中的主键是自动增量。

我试过了:

$id = $model->id;
$id = $model->find('id');
$id = $model->findByPK('id');

但价值是空白的,是否有任何建议让我获得正确的身份证明?

我需要id值的原因是因为我需要将id与其他值混合并保存到其他列中。

感谢。

6 个答案:

答案 0 :(得分:4)

$newId = YourModel::find()->max('id') + 1;

答案 1 :(得分:2)

AUTO_INCREMENT是一个特殊值,可能与最后一条记录的ID不同。

  • 如果删除了记录,则AUTO_INCREMENT仍将继续。
  • 如果无法插入记录,则AUTO_INCREMENT仍将继续。

假设您正在使用MySQL,您可以在phpMyAdmin中看到它的值。

  1. 打开数据库,然后打开一个表。
  2. 切换到“操作”选项卡 table-operations
  3. 在表格选项下找到AUTO_INCREMENT字段。 auto-increment-field
  4. 所以你应该获得它的值,特别是当你依赖数据库的AUTO_INCREMENT时。

    要插入一条记录,可以选择LAST_INSERT_ID()。但我仍然不喜欢做三重操作(插入,读取ID,更新)。最好最小化I / O操作(读取AUTO_INCREMENT,插入)。

    就我而言,我需要从Excel文档导入数据。当然,当性能很重要时,我不能依赖ActiveRecord模型。所以我使用batchInsert()命令。

    我正在采用this answer来获取MySQL中的AUTO_INCREMENT值。

    $lastModelId = Yii::$app->db->createCommand("
        SELECT `AUTO_INCREMENT`
        FROM  INFORMATION_SCHEMA.TABLES
        WHERE TABLE_SCHEMA = DATABASE()
        AND   TABLE_NAME   = 'my_table'
    ")->queryScalar();
    

    如果使用表格前缀:

    $lastModelId = Yii::$app->db->createCommand("
        SELECT `AUTO_INCREMENT`
        FROM  INFORMATION_SCHEMA.TABLES
        WHERE TABLE_SCHEMA = DATABASE()
        AND   TABLE_NAME   = :TableName
    ")->bindValues([
        ':TableName' => MyModel::getTableSchema()->name,
    ])->queryScalar();
    

答案 2 :(得分:0)

我找到了自己的aswer:

$max = Yii::app()->db->createCommand()->select('max(id) as max')->from('TABLENAME')->queryScalar();

$id = ($max + 1);

print_r($id);

感谢。

答案 3 :(得分:0)

最简单的方法是在保存记录后获取新ID。之后,您可以执行所需操作并再次保存。是这样的:

<?
$model = new YourModel;
$model->field1 = 'some value';
$model->field2 = 'some value 2';
//...
$model->save();

// now you have the new ID and you can use it
$id = $model->id;

// do what you need e.g.
$model->field3 = $field2 + $id;
$model->save();
?>

答案 4 :(得分:0)

这对我有用。

public static function getAutoIncrement($table_name)
{
    $q = new Query();
    $res = $q->select("AUTO_INCREMENT")
        ->from('INFORMATION_SCHEMA.TABLES')
        ->where("TABLE_SCHEMA = DATABASE() AND TABLE_NAME = '" . $table_name . "'")
        ->one();
    if($res)
        return $res["AUTO_INCREMENT"];
    return false;

    //or use this

    //$q = "SELECT `AUTO_INCREMENT` FROM  INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = '" . $table_name . "'";
    //$auto_increment = Yii::$app->db->createCommand($q)->queryScalar();
    //return $auto_increment;
}

答案 5 :(得分:-1)

你正在以错误的方式解决这个问题......

$model->id如果你事先实例化了$ model,那么这是可用的:

$model = new Model();
$id = $model->id; //this will work if id is the exact name of the column in db

$model->find('id')这会根据id找到DB中的元素,但语法错误,所以会引发错误

$model->findByPK('id')再次......如果与主键匹配(在拨打此电话之前您应该拥有),则pk会从数据库返回一行

总之,我会建议第一种方法,但不要忘记首先实例化模型。否则,你可以做类似的事情......

$model = Model::model()->findByAttributes(array('some_attribute' => $attribute_value));
$id = $model->id;

希望这有帮助!
继续编码!
顷。