在我的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 读取数据库模式并使用这些信息来确定有哪些主键,然后插入后如何更新记录中的主键。 因此,即使您的 ActiveRecord 定义定义了主键,这还不够。
Yii::app()->db->getLastInsertID() 实际上在这种情况下工作,但是如果这在多会话环境中有效,我是一个可疑的问题。 定义主键显然是更好的解决方案,如果还没有的话。
希望这对其他人有所帮助!