2018-11-07 10:16:17 1975次浏览 1条回答 0 悬赏 15 金钱

文章和单页我都弄在同一个文章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 条回复
    回复于 2018-11-07 10:47 回复

    哥们,能不能具体点,是不是在模型中的 afterSave 里面,添加if($this->getScenario() == 'article'){ 相关代码..},还是要写在控制器中的article-create这个函数里面?

    回复于 2018-11-07 13:04 回复

    afterSave里面啊

    回复于 2018-11-07 14:05 回复

    好的,谢谢,已经解决了哈!

    没有找到数据。
您需要登录后才可以回答。登录 | 立即注册
clao
见习主管

clao

注册时间:2018-08-03
最后登录:2022-01-25
在线时长:9小时19分
  • 粉丝1
  • 金钱80
  • 威望20
  • 积分370

热门问题