【发布时间】:2015-08-27 12:30:12
【问题描述】:
我对 Yii2 活动记录处理关系属性的方式感到困惑。是否可以将一个活动记录对象链接到另一个对象而不先保存它?
例如,我想将图像作为徽标添加到公司记录中,但尚未决定是否应保存这两个记录。给定一家公司
/**
* @property integer $logo_id
*/
class Company extends \yii\db\ActiveRecord
{
public function getLogo()
{
return $this->hasOne(Image::className(), ['id' => 'logo_id']);
}
}
还有一张图片
class Image extends \yii\db\ActiveRecord
{
…
}
有没有一种简单的方法来设置$company->logo = new Image();,以便下次调用$company->save() 时图像与公司一起保存,但不是在此之前?换句话说:我正在寻找相当于 @logo = @company.build_image() in rails 的 Yii2。
就目前而言,我在 Company 模型中定义了一个徽标设置函数。
public function setLogo(Image $image)
{
// `link` expects the primary key to be present
$image->id || $image->save();
$this->link('logo', $image);
}
这显然违反了最小惊讶原则,因为 setter 不仅会修改当前对象,还会以可能意想不到的方式影响(这里:保存)参数。这似乎是个糟糕的主意。
如何在不违背良好设计原则的情况下做到$company->logo = new Image?
【问题讨论】:
-
你在创建公司的时候上传图片吗?
-
@marche 有时,但通常会在以后发生(可能永远不会)。
-
您可以在您的 Company 模型中添加一个包含临时徽标的属性并稍后对其进行修改,但如果您不解释您希望完成的工作流程类型,我将无法为您提供更多帮助。
-
@marche 感谢您提供检查完整工作流程的提议,但公司政策不允许我在这里讨论此问题。目前,我主要对解决这个特定问题感兴趣。使用单独的属性来保存临时徽标肯定会起作用,但这似乎很不雅。它会给我们两个属性,其中一个就足够了。
-
您也可以使用一个单独的模型来保存您需要的所有字段,并在最后决定将公司和徽标保存到数据库中时。这个模型可以类似于新 Yii2 安装默认提供的 LoginForm 模型。
标签: activerecord yii2