[top-think/think]如何创建一个公用的query?

2023-12-27 599 views
4

@liu21st 遇到同样的疑问,想问下面这种情况闭包是怎么传?

controller里面定义了一个query

private $where;
public function __construct()
    {
        $this->query = new \think\db\Query();
        $this->query->where('status', 2);
        if ($this->isWriter) {
                $this->query->where('user_id', $this->user->id);
        }
    }
public function action1()
    {
        $data = Db::table('topic')->find($this->query);
        return $data;
    }
public function action2()
    {
        $data = Db::table('post')->find($this->query);
        return $data;
    }

如果我想创建一个这样能够跨model重用的query,代码应该怎么写?如果是闭包,应该怎么传?试了很多种方式。

之前laravel里面是用addNestedWhereQuery传入的query对象,翻看tp现在的源码,没有发现能够替代的方法

向老大求解。

回答

2

等最新的模型教程出来吧

1

会发布在纳尼?

8

应该是在kancloud.cn

3

你的这个需求其实 不就是查询范围的设计初衷么 根本不需要所谓的公共Query的概念啊

0

@liu21st 公共Query是业务逻辑的优化,不想每个地方都去写同样的代码。 已找到方案:

// baseController.php
$query = new \think\Query();
$query->where('user_id', 3);
// $where为一个公共的query
$this->where = function(&$q) use ($query) {
    $q = $query;
}

// articleController.php extend baseContoller
$data = model('xxx')->where($this->where)->where('category_id', 3)->select();
select * from xxx where user_id = 3 and category_id = 3
5

用查询范围啊