【问题标题】:Yii very weird save() behaviourYii 非常奇怪的 save() 行为
【发布时间】:2012-05-24 08:34:24
【问题描述】:

我遇到了非常非常奇怪的事情。在 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

当我只添加 ONE.... 时有 4 条记录,并且我输入的文本越多,就会创建更多的记录。按随机数量的字符分割,有时少到 4,有时多到 12。这是可重复的,但并非总是如此......我对这种行为完全目瞪口呆。

有没有人见过这样的事情并能对此有所了解? 提前致谢!

【问题讨论】:

  • 您能否显示用于获取“加入翻译和产品表”的查询,以及您查看结果的方式/位置?

标签: php mysql database yii


【解决方案1】:

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

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

所以“分而治之”你的问题。

MySQL

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

活动记录

然后将您的值硬编码到模型中。在您的控制器中,只需创建模型的一个实例并保存它。这是否复制了您遇到的问题?如果是这样,那是您的 ActiveRecord 实现存在问题。尝试删除关系并继续努力。

控制器

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

绑定

这可能是您如何将数据从表单绑定到模型的问题。手动设置表单的值,然后像往常一样将该数据绑定到模型。

这是后端测试真正可以帮助您的地方,因为您可以将有效的部分与无效的部分区分开来。研究 Behat 和 PHPUnit 等工具。

【讨论】:

  • 伙计,你是救世主:)。我运行了 mysql 日志,它似乎生成了正确的查询...我的意思是执行了 3 个查询 - 一个用于添加产品,一个用于添加两种不同的翻译。这意味着什么? MySQL 不知何故起作用了?
  • @RandomWhiteTrash 听起来您的关系配置不正确。回到文档,让它在最简单的级别上工作。使用迁移自动重新创建数据库,并使用模型插入一些固定装置。继续玩,直到您可以看到灯具被正确保存。
猜你喜欢
  • 1970-01-01
  • 2016-03-13
  • 2011-03-01
  • 1970-01-01
  • 2020-12-02
  • 1970-01-01
  • 1970-01-01
  • 2018-04-20
  • 2020-02-09
相关资源
最近更新 更多