Yii非常奇怪的save()行为

时间:2012-05-24 08:34:25

标签: php mysql database yii

我遇到了非常非常奇怪的事情。在VirtualBox,Ubuntu,Apache2,PHP,MySQL中工作我从一个特定的模型中得到了一些非常奇怪的行为。

我想添加输入相同字符串的多个语言版本的功能,比如说产品名称。我使用jQuery制作了很好的语言标签,并创建了临时数组来存储所有信息,使用CActiveForm小部件来收集和呈现数据。

<?php foreach($languages as $language): ?>
  <div id="tab_<?=$language->code?>">
    <div class="row">
      <?php echo $form->labelEx($model,'name'); ?>
      <?php echo $form->textField($model,"translations[$language->code][name]",array('size'=>60,'maxlength'=>128)); ?>
      <?php echo $form->error($model,"translations[$language->code][name]"); ?>
        </div>
    </div>
 [...]

所以这就是我如何将数据收集到$ translations数组中。这是我的$ translations数组:

$translations = array(
  'name' => 'NewName',
  'sub_name' => 'Subname'
);

然后我显然将它分配给Controler动作中的正确模型:

[...]
foreach ($translations as $key => $value){
  $x = new Translations();
  $x->language = $key;
  $x->id = $product->id;
  $x->name = $value['name'];
  $x->sub_name = $value['sub_name']
  $x->save();
}
[...]

现在还有其他字段,每个产品只有一个:

[...]
<div class="row">
  <?php echo $form->labelEx($model,'something'); ?>
  <?php echo $form->textField($model,'something',array('size'=>60,'maxlength'=>128)); ?>
  <?php echo $form->error($model,"something"); ?>
    </div>
</div>

这些只是通过

存储
$product->save();

一切都在整齐的交易中。

...无论其

我得到的结果是这样的(加入翻译和产品表):

id       name        subname        something
1        NewN
2        NewName     S
3        NewName     Subname        Som
4        NewName     Subname        Something

4条记录,当我只添加一个......以及我输入的更多文本时,会创建更多记录。按随机数字分割,有时少至4,有时多达12。这是可重复但不总是......我完全被这种行为所愚弄。

任何人都曾经看过这样的事情,可以对此有所了解吗? 提前谢谢!

1 个答案:

答案 0 :(得分:3)

问题可能出现在很多阶段:

  • 表格
  • 控制器
  • 将表单中的数据绑定到模型
  • 模型保存(ActiveRecord)
  • 甚至数据库

所以'分而治之'你的问题。

<强>的MySQL

打开“常规mysql日志”以查看发送给MySQL的查询。如果它们看起来像您在上面看到的奇怪形式,那么它不是数据库。在这个阶段你不太可能遇到任何问题,但最好还是排除它。

<强> ActiveRecord的

然后将您的值硬编码到模型中。在您的控制器中,只需创建模型的实例并保存即可。这会复制你遇到的问题吗?如果是这样,那么您的ActiveRecord实现就会出现问题。尝试删除关系并进行处理。

<强>控制器

你的控制器可能有些奇怪。同样,在创建实例时,硬编码要传递给模型的数据。

<强>装订

如何将数据从表单绑定到模型可能会出现问题。手动设置表单的值,然后将该数据正常绑定到模型。

这是后端测试可以真正帮助您的地方,因为您可以将哪些工作与非工作区分开来。查看Behat和PHPUnit等工具。