【问题标题】:Access the id after saving ActiveRecord model保存 ActiveRecord 模型后访问 id
【发布时间】:2016-03-02 23:10:57
【问题描述】:

我在访问 Yii2 框架中的 ActiveRecord 模型的 id 时遇到问题。当我保存刚刚创建的模型时,我无法获取新对象的 id 字段。

$house = new House;
$house->save();

$hid = $house->id;

$hid 值为空字符串''。

问题是我正在创建新模型,以便在创建数据库行时将新 ID 传递给处理文件移动的线程进程。线程启动,在 json 切片和数组填充后,第一次插入在 sql 条件(where)语句上失败。

我研究了很多答案,他们指出了几个缺陷:

  1. pk 的分配 - 我没有分配新的模型 id 字段(db 处理 pk 自动增量),我通过 json 接收 $_post 正文内容(json 有许多字段不能批量分配到主模型中,所以我处理在 $attibutes 插入之前对 json 数据进行切片)。
  2. 模型规则中的 pk - 我在模型规则数组中没有 id 字段。
  3. ActiveRecord 类中的错误 - 我不想破解框架的基类。

稍后在代码中我计划通过关系链接模型,但我认为由于这个错误而失败,所以我还使用 $hid 值来填充相关模型中的外键字段。

帮助。请。

【问题讨论】:

  • save() 是否返回 true?之后尝试print_r($house->errors); 看看是否验证失败。

标签: php orm yii2


【解决方案1】:

这样尝试可能是验证问题

    $house = new House;
    if ($house->validate()) {       
        $house->save();

        $hid = $house->id;
     } else {

        $errors = $house->errors;
        var_dump($errors)
    }

如果您看到 var_dump 的结果,则说明您的验证失败(例如:一些必填字段 ..),您需要更改房屋模型中的正确验证规则 ..

否则你不能尝试

  $house->save(false); //this way the validation is not executed 

(使用 save(false) 仅用于调试 porpose)

【讨论】:

    【解决方案2】:

    谢谢 scaisEdge 和 Alex。我忘了检查数据库的非空列。 yii2 gii 模块根据 db 模式生成模型,我错过了模型的规则字段。我不需要验证,因为我只是生成空行(只是 pk)。

    这是通过的代码:

    $house = new House;
    $house->name = 'name'; [field set as required in model rules array]
    $house->description = 'description'; [field set as required in model rules array]
    $house->save();
    
    $hid = $house->id;
    

    约定和配置,相当整洁。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-18
      • 2011-02-14
      • 2016-08-10
      • 1970-01-01
      • 1970-01-01
      • 2012-06-08
      • 2019-03-21
      相关资源
      最近更新 更多