top-think/think

TP6的before_select到底如何用,效果如何?

augushong opened this issue · 3 comments

TP6的数据库事件before_select是怎么用的,
研究了一下午,看了一下午源码,也没搞出来怎么用.
这个地方似乎需要返回结果集,比如select的结果,
但是如果使用select,又会触发before_select事件,最后进入死循环.

找了半天也没找到怎么用的,

    Db::event('before_select', function (Query $query) {
      $model = $query->where('sass_uid', Sass::getUid())->find();
      // dump($sql);
      
      // $query->where('sass_uid', Sass::getUid())->select();
      // $list = Db::query($sql);
      return [$model];
      
      // return true;
    });

复制代码
按照我的理解,只需要在事件里面操作query就可以了,
但是实际上,如果存在事件,就不会进行原有的查询,会把事件的返回当做结果集,这应该是不对的吧.

   public function select(BaseQuery $query): array
      {
        $resultSet = $this->db->trigger('before_select', $query);
        if (!$resultSet) {
          // 执行查询操作
          $resultSet = $this->pdoQuery($query, function ($query) {
            return $this->builder->select($query);
          });
        }
        return $resultSet;
      }

改进,似乎只要把!去掉就可以了

 if (!$resultSet) {

改为

 if ($resultSet) {

不对,应该直接去掉逻辑判断,把整个if去掉,
这样的话before_select就变成了只是修改query,返回值无效.

public function select(BaseQuery $query): array
  {
    $resultSet = $this->db->trigger('before_select', $query);

    // if (!$resultSet) {
      // 执行查询操作
      $resultSet = $this->pdoQuery($query, function ($query) {
        return $this->builder->select($query);
      });
    // }

    return $resultSet;
  }

应该是,你在事件中做了查询就返回,select中就不再做查询。
如果你只是对query添加了条件或其它,不需要返回值,系统会继续做查询操作并返回

这个地方 我还是统一下规范吧 改成只能修改query对象 省的以后很多人滥用 而且还考虑到 不使用TP框架的情况