[top-think/think]TP6的before_select到底如何用,效果如何?

2023-12-11 899 views
9

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) {

回答

4

不对,应该直接去掉逻辑判断,把整个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;
  }
7

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

6

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