Jeen

Jeen

难得糊涂

  • 财富值1120
  • 威望值190
  • 总积分3190

个人信息

  • 发布了教程
    GridView 添加关联属性或自定义列
  • 看到很多人对于 类似批量更新 提出的问题,另外据个人所知框架是没有提供什么优雅便捷方法的 (也欢迎大牛补充)。
    这边先说下拼接 SQL 的样例:

    public function logicFun()
    {
        $tbName = 'tb_test';
        $db = \Yii::$app->getDb();
        $sqls = [];
        $sqls[] = (new \yii\db\Query())->createCommand($db)
            ->update($tbName,['lock'=>'yes'],['id'=>3])
            ->getRawSql();
        $sqls[] = (new \yii\db\Query())->createCommand($db)
            ->update($tbName,['lock'=>'no'],['id'=>[4,5]])
            ->getRawSql();
        $sql = implode(";\n", $sqls) . ';';
        $query = $db->createCommand($sql);
    
    //        var_dump($query->getRawSql());
    //output:
    //        UPDATE `tb_test` SET `lock`='yes' WHERE `id`=3;
    //        UPDATE `tb_test` SET `lock`='no' WHERE `id` IN (4, 5);
    
        return $query->execute();
    }
    

    看一下上述代码,或许大家会觉得,“我要找的是优雅的解决方法,这么麻烦的话,我还用得着这样写?!” 还不如直接更新呢,如下:

    ModelClass::updateAll(['lock'=>'yes'],['id'=>3]);
    ModelClass::updateAll(['lock'=>'no'],['id'=>[4,5]]);
    

    说实话 ,“从(拼接)SQL中寻找优雅的解决方案” 个人是不太能理解的,因为更新跟批量插入本就是不同的场景。 或者说批量插入,也是提前准备好的数据,而不是在sql中决定具体插入的字段值。
    自认为把数据处理逻辑写到sql中会让代码逻辑更加晦涩,后期维护难度更高。
    所以,“非得一次拼接出 批量更新的语句” 或者 “非常优雅的解决一些高复杂的问题”,个人觉得可以追求 但不必苛求。
    个人观点,欢迎补充,不喜勿喷。

  • 这关联...

    简单看了下,问题应该出在 ->where ... ->andFilterWhere ... 的混用上面

    建议尝试把 andFilterWhere 修改为 andWhere
    或者把查询条件组装一下, 只用一个 where(['and',...])

    如果已解决,不妨也分享下解决方法 :)

  • 回复了 的回答

    你用的似乎是 basic 版本,命令行 控制器 默认的需要放在 commands 目录下面

    噢噢, 没注意 :) 平时用basic比较少, 看了下 你改的配置, 可以尝试检查下 Yii::setAlias('@console'... 是不是不对,其他的没感觉会有问题

  • 你用的似乎是 basic 版本,命令行 控制器 默认的需要放在 commands 目录下面

  • 发布了源码
    Yii2 手动快速集成 phpexcel
  • 2019-01-22 已签到
    连续签到1天,获得了5个金钱
  • 回复了 的回答

    首先解答一个疑问,不是“父类调用了子类的方法”,而是“子类继承了父类的方法,供这个子类的实例对象调用”。

    至于你提到的两种写法,怎么说呢, 原则上讲类的封装就是为了方便复用,所以写法一和写法二,本身都是对的。

    只是假如 Parent 类有另外一个子类(SubClass)也需要say方法,且say方法的逻辑流程与你给的流程完全一致时,那SubClass是否也需要实现一次say方法?

    通常答案是“no”,say方法从Parent类继承,我们只需要 在SubClass中实现它特定的dosomething 即可与 children 类进行区分。
    如果有特定情况,我们也可以在 SubClass 中重写 say 方法,实现其他特殊需求。

    额,说的比较模糊。欣赏你观察和思考问题的方式,但至于实际代码怎么写,见仁见智吧

    关于父类子类,同我之前说的,抽象方法可在子类中“实现”,具体方法可在子类中“重写”,当然不管是实现还是重写,实例化这个子类后,调用这个方法,执行的都是子类中的代码逻辑。另外,后面补充的,行为注入是框架提供的另外一种复用类方法的途径,跟父子类继承没有什么关系。 说的有点儿绕,不太明白你目前的疑问具体是什么。

    建议回到基础的关系上来看问题, 父类 子类 实例对象。通常类只提供属性和方法的定义以及继承,实际的调用是“实例对象”进行操作的,所以调用的具体流程还得看这个对象 实例化的是哪个类。

    其实我个人是不太建议在这些原理定义或者专业术语上花费太多时间的,大部分实际业务的实现,只需要知道相关的用法即可。
    当然摸清楚底层原理,对提升整体的理解力大有帮助,学其他东西也跟容易触类旁通。

  • 仔细读几遍报错信息吧
    或者
    把 SiteController 文件的 前20行代码帖出来看看
    包含 <?php ...

  • 首先解答一个疑问,不是“父类调用了子类的方法”,而是“子类继承了父类的方法,供这个子类的实例对象调用”。

    至于你提到的两种写法,怎么说呢, 原则上讲类的封装就是为了方便复用,所以写法一和写法二,本身都是对的。

    只是假如 Parent 类有另外一个子类(SubClass)也需要say方法,且say方法的逻辑流程与你给的流程完全一致时,那SubClass是否也需要实现一次say方法?

    通常答案是“no”,say方法从Parent类继承,我们只需要 在SubClass中实现它特定的dosomething 即可与 children 类进行区分。
    如果有特定情况,我们也可以在 SubClass 中重写 say 方法,实现其他特殊需求。

    额,说的比较模糊。欣赏你观察和思考问题的方式,但至于实际代码怎么写,见仁见智吧

总监 等级规则
3190/5000
资料完整度
50/100
用户活跃度
0/100

Ta的关注

0

Ta的粉丝

9

Ta的访客

41