2019-05-29 00:26:29 2084次浏览 2条回答 0 悬赏 10 金钱

我想实现一个复制数据库中的某一项,在保留绝大多数相同字段值的情况下对某个字段值稍作修改,并且作为一项新的数据插入表中,我使用下面的语句:

$announce = Announce::findOne(7);
//echo $announce->title;
$announce->content = '新的内容';
var_dump($announce->insert());

运行结果提示在insert时,title字段为空导致运行错误(数据库格式中title字段有不能为空的设置),但是我echo的时候明明能出现原先的title值。

请问这是什么原因?如果我想实现上面提到的功能应该如何修改代码?

最佳答案

  • 发布于 2019-05-29 08:45 举报

    查看了一下框架的 源代码,yii 在插入一条新记录的时候,只插入了那些“脏”属性,为什么框架要这么设计,恐怕只能去问作者了,我觉得这里是 没有 这个必要的,直接插入全部的属性就是了,毕竟这是一个 insert 的操作,而不是 update (大家不妨在此 讨论下 作者设计成这样是出于 什么样的考虑)

    至于你的问题,随便弄弄就行了,代码都 很简单,不需要 解释什么吧
    1、

    $announce = Announce::findOne(7); 
    $announce->id = null;
    $announce->isNewRecord = true;
    $announce->content = "新的内容";
    $announce->insert();
    

    2、

    $announce = Announce::findOne(7); 
    $announce2 = new Announce;
    $announce2->attributes = $announce->attributes;        // 这里需要 rules 支持
    $announce2->content = "新的内容";
    $announce2->insert();
    

    3、

    $announce = Announce::findOne(7); 
    $announce->content = "新的内容";
    $announce->markAttributeDirty("title");       // 它不是要脏属性么,就标记给他 
    $announce->markAttributeDirty("...");        // 其它的字段
    $announce->insert();
    
    2 条回复
    回复于 2019-05-29 10:12 回复

    感谢您的回答

    回复于 2019-05-29 10:12 回复

    感谢您的回答

  • 回答于 2019-05-29 08:39 举报

    重新赋值给一个变量,然后unset主键,然后重新实例化模型执行insert(变量)

    1 条回复
    回复于 2019-05-29 10:13 回复

    感谢您的回答

您需要登录后才可以回答。登录 | 立即注册
捣捣爸
见习主管

捣捣爸

注册时间:2019-05-23
最后登录:2022-04-26
在线时长:9小时29分
  • 粉丝0
  • 金钱105
  • 威望10
  • 积分295

热门问题