【问题标题】:Best practices to save models that are related with a foreign key保存与外键相关的模型的最佳实践
【发布时间】:2012-11-22 09:31:18
【问题描述】:

有这样一个场景,我有一个模型Project,这个项目有一个Images 的画廊。所以:

Project HAS_MANY Image
Image BELONGS_TO Project -> Foreign key: project_id

在一个表单中,我希望能够将项目信息和多个图像一起保存。问题是我如何获得project_id,因为模型Project 有一个自动递增的ID,在保存模型之前我无法访问它。

我想到的一种方法是在开始时虚拟保存模型,然后在用户提交更新它的表单之后。不过好像很恶心!

以相同形式保存具有 HAS_MANY 和 BELONGS_TO 关系的模型的最佳做法是什么?

【问题讨论】:

  • dummy save the model in the begining没关系,如果用户不上传任何图片,设置虚拟模型的状态,你需要删除虚拟项目
  • 当您有一些必填字段时,这是一个问题...我不想让用户先保存表单的某些部分,然后让他更新其余部分...
  • 如果$project->save()返回true,你能不保存图片吗?如果有图片上传失败,把它作为错误添加到项目模型中?
  • 我没明白你的意思...

标签: php database foreign-key-relationship yii


【解决方案1】:

对我来说,最好的解决方案是扩展 activerecord-relation-behavior。扩展将处理所有的 HAS_MANY 和 MANY_MANY 关系。

由于它是一种行为,它将处理您需要父模型的 id 以将其分配给子模型的部分。所以不要这样做

//save to get the id
if($project->save()) {
    foreach($images as $image) {
        $image->project_id = $project->id;
        if(!$image->save()) {
            //Handle the errors        
        }
    }
}

您只需要做:

$project->images = $images;
if($project->save()) {
    //do what you have to do (redirection, render, ...)
}

【讨论】:

  • 如果她使用标准上传,如果 Masha 在必须使用虚拟保存时使用 xuploadform 之类的东西,这将是有效的。
  • 不要忘记检查项目是否先保存并保存图像。
  • 是的,你是对的,我想让它变得简单,将编辑我的示例
  • 使用扩展名将执行虚拟保存,但您不必担心。调用 $project->save() 后,您只需重定向用户或显示适当的视图
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-07
  • 2014-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多