CakePHP 3.x ORM get()、find() 以及如何禁用befeoreFind()?
Posted
技术标签:
【中文标题】CakePHP 3.x ORM get()、find() 以及如何禁用befeoreFind()?【英文标题】:CakePHP 3.x ORM get(), find() and how to disable befeoreFind()? 【发布时间】:2016-04-04 18:34:46 【问题描述】:我使用 beforeFind() 回调和一些在大多数情况下必须应用的条件,但不是全部。问题是关于这个的。
禁用 beforeFind() 回调的正确方法是什么?
目前我使用这种方法:
在 beforeFind() 中,如果选项默认为 false,我将返回 $query
if(isset($options['default']) && $options['default'] == false)
return $query;
现在当我执行 find() 操作时,我可以通过将默认选项设置为 false 来禁用
$this->Articles->find()->applyOptions(['default' => false])...
但是当我使用 get() 方法时,我不知道该怎么做......
我可以再次使用 findById() 和 applyOptions,但如果有其他我更喜欢的方式。
提前致谢!
【问题讨论】:
@AD7six 我该怎么做? 【参考方案1】:随便用
$this->Hotels->get($id, ['default' => false]);
$options 将被传递,您的 beforeFind 将继续工作:-D
【讨论】:
【参考方案2】:我使用 beforeFind() 回调和一些在大多数情况下必须应用的条件,但不是全部。
Use a custom finder 而不是 beforeFind() 回调并在那里实现您的逻辑或条件。然后,您可以链接它们并仅在需要时使用它们。我建议您阅读有关它们的手册部分。
$this->find('all')->find('myConditions');
手册中的示例:
use Cake\ORM\Query;
use Cake\ORM\Table;
class ArticlesTable extends Table
public function findOwnedBy(Query $query, array $options)
$user = $options['user'];
return $query->where(['author_id' => $user->id]);
// In a controller or table method.
$articles = TableRegistry::get('Articles');
$query = $articles->find('ownedBy', ['user' => $userEntity]);
【讨论】:
感谢您的回答,但它没有回答问题:如何仅在某些 find() 或 get() 操作中禁用 beforeFind() 回调?如果不可能,我会使用建议的解决方案。以上是关于CakePHP 3.x ORM get()、find() 以及如何禁用befeoreFind()?的主要内容,如果未能解决你的问题,请参考以下文章
cakephp 3.x datetime字段比较查询中没有返回正确的结果
调用未定义的方法 Cake\ORM\Entity::query() CakePhp
为啥使用 Doctrine 而不是 CakePHP 的标准数据库 ORM?