对于空结果,Yii2 afterFind()

时间:2016-04-21 12:28:46

标签: php activerecord yii2

我在我的一个模型中重载了afterFind()函数:

public function afterFind()
{
    parent::afterFind();
    echo "<PRE>";
    echo var_dump($this);
    echo "</PRE>";
    die();
}

如果查询结果不为空,我会收到转储。

但是,如果执行的查询没有返回结果,则不会调用此方法。

我需要调用它,特别是在没有发现任何结果试图通过不同的源加载请求的数据的情况下。

我怎样才能实现这个目标?

[编辑]

通过以下方式调用查找:

return $this->hasOne(Myclass::className(), ['id' => 'key_id']);

因为hasOne(...)使用

public function hasOne($class, $link)
{
    /* @var $class ActiveRecordInterface */
    /* @var $query ActiveQuery */
    $query = $class::find();
    $query->primaryModel = $this;
    $query->link = $link;
    $query->multiple = false;
    return $query;
}

1 个答案:

答案 0 :(得分:1)

  1. :: find()方法来自ActiveRecord类并创建您的ActiveQuery对象

  2. - &gt; afterFind()方法来自ActiveQuery类/对象,但只有在查询返回非空结果的情况下才会触发

  3. 如果您需要执行某些操作,无论查询是否返回结果,您都可以:

    1. 只需使用您的关系方法
    2.   

      $ query = $ this-&gt; hasOne(Myclass :: className(),[&#39; id&#39; =&gt;&#39; key_id&#39;]);

           

      //在这里做你的东西......

           

      返回$ query;

      1. 如果您搜索更多全局解决方案,那么您可以在自己的活动记录类中扩展 yii \ db \ ActiveRecor d,例如 app \ components \ MyActiveRecord 并覆盖 __ get 方法。然后使用 MyActiveRecord 作为模型的基类(在您的示例中为 Myclass ),而不是通常的 ActiveRecord
      2.   

             

        命名空间app \ components;

             

        类MyActiveRecord extends \ yii \ db \ ActiveRecord {

        public function __get($name)
        {
            if (isset($this->_attributes[$name]) || array_key_exists($name, $this->_attributes)) {
                return $this->_attributes[$name];
            } elseif ($this->hasAttribute($name)) {
                return null;
            } else {
                if (isset($this->_related[$name]) || array_key_exists($name, $this->_related)) {
                    return $this->_related[$name];
                }
                $value = parent::__get($name);
                if ($value instanceof ActiveQueryInterface) {
                    $result = $this->_related[$name] = $value->findFor($name, $this);
                    // Do your stuff here.
                    return $result;
                } else {
                    return $value;
                }
            }
        } }