【问题标题】:Yii AR transaction: auto increment id returns nullYii AR 交易:自动递增 id 返回 null
【发布时间】:2013-10-13 13:22:11
【问题描述】:

在我的 Yii 应用程序中,我有这个关系(产品有很多属性),产品表主键是自动递增的,属性表有外键 product_id 到相关产品。 当我在 yii 中使用事务来保存父级(产品)和子级(属性)时出现错误(product_id 不能为空),这是因为 ($product->id) 在事务中保存后返回 NULL。 这是我的代码:

        $transaction = Yii::app()->db->beginTransaction();
    try {
        $product = new Product;
        $product->name = 'name_product';

        if ($product->save()) {
            $product_attribut = new ProductAtt;
            $product_attribut->product_id = $product->id;
            $product_attribut->name = 'att_name';
            $product_attribut->value = 22;
            if (!$product_attribut->save()) {
                throw new Exception('fail');
            }
        } else {
            throw new Exception('fail');
        }

        $transaction->commit();
        echo 'success';
    } catch (Exception $e) {
        $transaction->rollback();
        echo $e->getMessage();
    }

请在交易中保存此关系的任何想法..谢谢。

【问题讨论】:

  • 你试过用Yii::app()->db->getLastInsertID()代替$product->id吗?
  • 此方法将返回当前数据库连接的最后一个 id 还是所有连接的全局最后一个 id。如果它返回当前的最后一个 .. 那么我担心 Yii 是否在数据库连接中使用单例模式
  • 我有一个类似的代码并且工作得很好。你的问题不在于交易。数据库中是否有任何错误?

标签: php activerecord yii transactions auto-increment


【解决方案1】:

以防万一其他人遇到这个问题,我找到了迄今为​​止在我读过的所有类似问题中都没有提到的解决方案:

确保您已为您的数据库分配了主键。即使您有一个自动增量字段,这也不一定意味着您已经定义了一个主键。 Yii 读取数据库模式并使用此信息来确定存在哪些主键,以及随后如何在插入后更新记录中的主键。所以即使你的ActiveRecord定义已经定义了一个主键,这还不够。

Yii::app()->db->getLastInsertID() 实际上适用于这种情况,但是我怀疑这是否适用于多会话环境。如果您还没有定义主键,显然是更好的解决方案。

希望这对其他人有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-18
    • 2010-10-04
    • 2015-03-10
    • 1970-01-01
    • 2014-10-29
    • 1970-01-01
    相关资源
    最近更新 更多