chinpei215/cakephp-stackable-finder

CakePHP 2.x 插件,实现自定义查找器的堆叠

0.2.0 2015-12-25 13:20 UTC

This package is not auto-updated.

Last update: 2024-09-26 00:11:34 UTC


README

Software License Build Status Coverage Status

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 在被调用之前更改了数组。

如果需要,您可以在模型中覆盖这些方法来改变行为。