chinpei215 / cakephp-stackable-finder
CakePHP 2.x 插件,实现自定义查找器的堆叠
Requires
This package is not auto-updated.
Last update: 2024-09-26 00:11:34 UTC
README
CakePHP 2.x 的 StackableFinder 插件
要求
- CakePHP 2.x
- PHP 5.3+
安装
- 将
StackableFinder目录放入您的插件目录中。您也可以通过 Composer 安装。 - 在您的
app/Config/bootstrap.php文件中启用StackableFinder插件。 - 在您的模型中启用
StackableFinder.StackableFinder行为。
用法
$articles = $this->Article->q() ->find('all', ['conditions' => ['Article.created >=' => '2015-01-01']]) ->findAllByUserId(1) // Magic finder ->find('published') // Custom finder ->find('list') ->exec();
您可以通过调用 q() 开始堆叠查找器,并通过调用 exec() 执行查询并获取结果。
注意,q() 方法返回一个 StackableFinder 的实例。该对象还具有类似 Model 的 find() 方法 - 因此您可以使用流畅的接口,但它不是 Model 的子类。
因此,您不能调用 Model 实现的任何其他方法。
$this->Article->q()->read(); // Error
相反,您可以使用 where() 或其他 3.x 兼容的方法来构建查询。
$articles = $this->Article->q() ->select(['Article.id', 'Article.title']) ->contain('Author') ->where(['Article.user_id' => 1]) ->order(['Article.id' => 'DESC']) ->limit(10) ->offset(0) ->exec();
子查询
您可以创建如下所示的子查询
$q = $this->User->q()->select('id'); $articles = $this->Article->q() ->where([ 'user_id IN ?' => [$q] ]) ->exec();
您会看到 IN ? 出现在左侧字段的后面,您还会看到 $q 出现在右侧的方括号内。
它不兼容 3.x,但在 2.x 中是必要的。
获取结果
如上所述,您可以通过调用 exec() 来执行,但还有其他一些方法可以获取查询结果。
您可以直接迭代 StackableFinder 对象。
$q = $this->Article->q()->find('list'); foreach ($q as $id => $title) { // ... }
或者您可以使用 first() 或 count() 而不是 exec()。
$articles = $this->Article->q() ->find('published') ->first();
这和下面的代码一样
$articles = $this->Article->q() ->find('published') ->find('first') ->exec();
但是,请注意,在 find('list') 之后堆叠 find('first') 或 first() 是不起作用的。因为 _findFirst() 实际上返回的不是第一个结果。它返回的是索引为 0 的元素。
所以这是一个不好的例子
$articles = $this->Article->q() ->find('list') ->first();
您会得到一个空数组,而不是列表的第一个条目。
还请注意,在 find('list') 之后堆叠 find('count') 或 count() 也不起作用。因为 _findCount() 期望一个类似 [['Model' => ['count' => N ]]] 的数组,但 _findList 在被调用之前更改了数组。
如果需要,您可以在模型中覆盖这些方法来改变行为。