2015-06-11 17:16:15 11807次浏览 10条回答 3 悬赏 20 金钱

下面的是POST接收到的数据

Array
(
    [_csrf] => MWhSQ3N3M0MGDgsoHz5jdW4mBwhHOUAuWiYHNkAtcRMGIBEFAiFsMw==
    [Dynamic] => Array
    (
        [type] => 1
        [title] => 这是标题
        [images] => Array
            (
                [0] => http://f.cloud.com/143401345875600900.jpg
                [1] => http://f.cloud.com/143401345242854600.jpg
                [2] => http://f.cloud.com/143401345054916700.jpg
                [3] => http://f.cloud.com/143401345542255100.jpg
            )

        [content] => 这是内容
        [url] => 
    )

) 

这个是action的代码

public function actionUpdate($id)
{
    $model = $this->findModel($id);

    if ($model->load(Yii::$app->request->post()) && $model->save()) {
        return $this->redirect(['view', 'id' => $model->id]);
    } else {
        return $this->render('update', [
            'model' => $model,
        ]);
    }
}

images 是 text 类型,需要储存多张图片。
问题是:YII2 有没有自动序列化的功能并且储存到字段

如果没有怎么将序列化后的images赋值给POST

群里的回答:
程涛:
1 是写在rule里
2 写在beforsave

最佳答案

  • 鬼一浪人 发布于 2015-06-12 18:40 举报

    我来了,正如我轻轻的来,不带走一片云彩。

    public function actionUpdate($id)
    {
        $model = $this->findModel($id);
    
        if ($model->load(Yii::$app->request->post()) && $model->save()) {
            return $this->redirect(['view', 'id' => $model->id]);
        } else {
            return $this->render('update', [
                'model' => $model,
            ]);
        }
    }
    

    $model->load(Yii::$app->request->post()) && $model->save()
    这么写直接就是将post的值直接就存入了数据库,说好的$model->validate();进行安全过滤呢?
    虽然在save前会自动进行参数合法性过滤的。
    对于rules规则自动过滤法则还没研究透,但有一个场景是肯定的,那就是对要存储的值设定个默认值,比如会员的开启状态,在会员注册场景的时候在rules规则里面进行某字段比如 status,将其设定为1。这个在rules规则里面设定毫无疑问。

    就楼主的需求来看,个人感觉是,完全可以写在控制器里面了。

    public function actionUpdate($id)
    {
        $model = $this->findModel($id);
    
        if ($model->load(Yii::$app->request->post())) {
             //就这一句完成你需要的效果,序列化images让其重新赋给images,如此方可
             $model->setAttribute('images',serialize($model->getAttribute('images')));
             if($model->validate() && $model->save()){
                 return $this->redirect(['view', 'id' => $model->id]);
             }else{
                 echo '这里的代码是因为修改代码逻辑而导致的,请妥善处理';
             }
        } else {
            return $this->render('update', [
                'model' => $model,
            ]);
        }
    }
    

    看完了另外一个问题才看到该问题,就顺便回答了。
    希望解决你的问题!
    我是鬼鬼,鬼一浪人是也!20150612

    觉得很赞
  • 回答于 2015-06-11 17:21 举报

    虽然我不会但是我来看一下

  • 回答于 2015-06-11 17:25 举报

    重写afterValidate()方法应该可以做到

    1 条回复
    回复于 2015-06-12 18:51 回复

    感谢你的回答,POST过来是数组,模型验证通过不了。

    觉得很赞
  • 回答于 2015-06-12 10:02 举报

    这样也可以。

    if ($model->load(Yii::$app->request->post())) {
        $model->images = serialize($model->images);
        if ($model->save()) {
            return $this->redirect(['view', 'id' => $model->id]);
        }
    }
    
    觉得很赞
  • 回答于 2015-06-12 10:03 举报

    save() 方法保存之前,你先用一个分隔符号拆分 images 属性不就好了吗?

    1 条回复
    回复于 2015-06-12 10:08 回复

    使用自定义的格式化数据,会显得不专业不牛逼。。

  • 回答于 2015-06-12 10:18 举报

    model里的beforeSave($insert)用过么?骚年

    5 条回复
    回复于 2015-06-12 11:57 回复

    骚年正在看 。。。

    回复于 2015-06-12 11:57 回复

    骚年正在看 。。。

    回复于 2015-06-12 18:53 回复

    经过实践,beforeSave 无法区分是insert还是update ,造成的结果就是重复序列化。

    回复于 2015-06-12 20:49 回复

    必须有啊,ActiveRecord里面有一个getIsNewRecord()方法,就是用来判断是insert还是update的。你看看ActiveRecord里面save()方法的原型。

    回复于 2015-06-13 10:00 回复

    大师果然功力深厚,骚年马上去看。

  • 回答于 2015-06-12 10:20 举报

    个人对于这种数据的分割合并处理,都是卸载beforeSave里头的。不在action里头处理这些。

    , 觉得很赞
  • 回答于 2015-06-12 20:59 举报

    好高深的样子,涨姿势了

  • 回答于 2016-04-06 14:43 举报

    都说这么高深,那还让小白怎么活,帖出来beforeSave 如何解决的

  • 回答于 2016-09-05 15:28 举报

    版主,你这个问题怎么解决的哈,遇到跟你类似的问题了,求指点

    1 条回复
    回复于 2016-09-12 19:35 回复

    我写了一个通用的行为,用在控制器里去序列化图片。
    查询结果使用的是模型中的afterFind 反序列化图片。

您需要登录后才可以回答。登录 | 立即注册
trylife
总监

trylife Beijing

注册时间:2015-03-26
最后登录:2020-12-07
在线时长:51小时55分
  • 粉丝39
  • 金钱1626
  • 威望40
  • 积分2536

热门问题