关于 Yii2 场景的应用的问题 [ 2.0 版本 ]
文章和单页我都弄在同一个文章Article模型和同一个文章控制器中ArticleController,里面有三张数据表如下:
一张是文章基础表(文章和单页共有的字段表)article(id,cid,publisher_id,publisher_name,type,title,summary,content,sort,status,created_at,updated_at)
,
一张是文章属性表(仅文章特有字段表)article_property(id,article_id,author,is_slider,is_image,is_video)
,
一张是单页属性表(仅单页特有字段表)article_page(id,article_id,name_cn,name_en,desc_cn,desc_en)
,
在控制器中 article-create(文章的创建页)中也设置了场景,我的想法是文章创建的时候,文章基础表和文章属性表各创建一条相应的数据,存储相关的数据,可是我创建文章的时候,单页属性表也创建的一条数据,按道理来说,创建的是文章不是单页,这个单页表是不能产生数据的,感觉是不是 afterSave 中少了验证场景的操作,如果是要怎么写这个验证呢,大家帮我看下哈。
我在模型中设置了场景如下:
public function scenarios()
{
return [
'article' => ['cid', 'type', 'title', 'summary', 'content', 'sort', 'status', 'create_at', 'update_at', 'author', 'is_slider', 'is_image', 'is_video'],
'page' => ['cid', 'type', 'title', 'summary', 'content', 'sort', 'status', 'create_at', 'update_at', 'name_cn', 'name_en', 'desc_cn', 'desc_en'],
];
}
模型中的 beforeSave 写法如下:
public function beforeSave($insert)
{
if ($insert) {
$this->publisher_id = yii::$app->getUser()->getIdentity()->getId();
$this->publisher_name = yii::$app->getUser()->getIdentity()->username;
}
return parent::beforeSave($insert);
}
模型中的 afterSave 写法如下:
public function afterSave($insert, $changedAttributes)
{
if ($insert) {
$propertyModel = new ArticleProperty();
$propertyModel->article_id = $this->id;
$pageModel = new ArticlePage();
$pageModel->article_id = $this->id;
} else {
$propertyModel = ArticleProperty::findOne(['article_id' => $this->id]);
if ($propertyModel == null) {
$propertyModel = new ArticleProperty();
$propertyModel->article_id = $this->id;
}
$pageModel = ArticlePage::findOne(['article_id' => $this->id]);
if ($pageModel == null) {
$pageModel = new ArticlePage();
$pageModel->article_id = $this->id;
}
}
// 文章保存
$propertyModel->author = $this->author;
$propertyModel->is_slider = $this->is_slider;
$propertyModel->is_image = $this->is_image;
$propertyModel->is_video = $this->is_video;
$propertyModel->save();
// 单页保存
$pageModel->name_cn = $this->name_cn;
$pageModel->name_en = $this->name_en;
$pageModel->desc_cn = $this->desc_cn;
$pageModel->desc_en = $this->desc_en;
$pageModel->save();
parent::afterSave($insert, $changedAttributes);
}
最佳答案
-
johnny1991 发布于 2018-11-07 10:37 举报
model有方法getScenario()和setScenario(), 你通过判断scenario就可以控制了
共 3 条回复johnny1991 回复于 2018-11-07 13:04 回复@clao afterSave里面啊
其他 0 个回答
没有找到数据。
clao
注册时间:2018-08-03
最后登录:2022-01-25
在线时长:9小时19分
最后登录:2022-01-25
在线时长:9小时19分
- 粉丝1
- 金钱80
- 威望20
- 积分370