2015-05-25 15:47:34 9504次浏览 4条回答 3 悬赏 100 金钱

大家好,请问, 使用AR updateAll 是不是 不会触发 afterUpdate 等事件?

类似的内容 请问哪里查看? 代码中是否可以 在使用 updateAll 之后 手工触发 afterUpdate 事件?

最佳答案

  • 性感的农民 发布于 2015-05-25 17:36 举报

    updateAll()只返回受影响的行数,那个行数在一个事件里能玩出什么名堂呢?所以afterUpdate对于updateAll来说没有任何意义。你想干什么,就在调用updateAll()之后调用一个函数就好了,或者触发一个自定义的事件。

    比较update()updateAll()的区别。或者看这两个函数的框架源码。

    4 条回复
    回复于 2015-05-25 18:53 回复

    多谢了。 恩,如果你给几行 就在调用updateAll()之后调用一个函数就好了,或者触发一个自定义的事件。 的例子代码就好了。那我分都给你~~~

    回复于 2015-05-25 23:00 回复

    呵呵,不要纠结分的事情,能帮到人也是很开心的。之前我就和舰长说不好意思再答题了,大家一起玩才好玩嘛。

    函数就不用说了吧。下面贴一点我原来学习Event用的代码片段你参考一下吧:

    1 定义Event派生类。你要传参给事件句柄才需要这个类,不传参时trigger函数的Event使用缺省值null(第二个参数)。

    <?php
    namespace app\modules\advertise\components;
    use yii\base\Event;
    class CrudEvent extends Event
    {
        public $id;
    }
    

    2 定义事件句柄,就是事件被触发之后执行的函数,本例是写成一个杂项类Misc的静态方法:

    namespace common\helpers;
    ......
        public static function addCustomer($event)
        {
            $id = $event->id;
            die("addCustomer, id: $id");
        }
    
        public static function delCustomer($event)
        {
            $id = $event->id;
            die("delCustomer, id: $id");    
        }
    

    3 定义事件名称,并与事件句柄绑定:事件名称,通常是写成类的const属性,大写。本例写在控制器中,并重载beforeAction函数,绑定“事件名称”和“事件句柄”

    use app\modules\advertise\components\CrudEvent;         #上面的事件类
    ......
        const EVENT_ADDCUSTOMER = 'add-customer';       #用户添加了客户,该用户的客户总数+1
        const EVENT_DELCUSTOMER = 'del-customer';       #用户删除了客户,该用户的客户总数-1
    ......
    
        /**
         * @inheritdoc
         */
        public function beforeAction($action)
        {
            if (parent::beforeAction($action)) {
                $this->on(self::EVENT_ADDCUSTOMER, ['common\helpers\Misc','addCustomer']);
                $this->on(self::EVENT_DELCUSTOMER, ['common\helpers\Misc','delCustomer']);
                return true;
            } else {
                return false;
            }
        }
    
    
    

    4 触发事件。本例是在控制器的actionCreate中测试的,按照MVC的思想,放在Model的afterSave方法中更好。

    $this->trigger(self::EVENT_ADDCUSTOMER, new CrudEvent(['id'=>$id]));
    

    5 测试。添加记录后看到浏览器显示addCustomer, id: 2,就说明trigger成功了。

    回复于 2015-05-26 09:36 回复

    农民哥真是为社区操碎了心啊,每次回复都这么认真!

    回复于 2015-05-26 10:06 回复

    谢谢你这么说。不过这不算什么,我用latex写的文档比这炫很多哦。

    , , , 觉得很赞
您需要登录后才可以回答。登录 | 立即注册
xjdata
CEO

xjdata

注册时间:2011-12-07
最后登录:2021-07-09
在线时长:112小时28分
  • 粉丝23
  • 金钱14169
  • 威望75
  • 积分16039

热门问题