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()?的主要内容,如果未能解决你的问题,请参考以下文章

ORM如何在CakePHP3中运行

cakephp 3.x datetime字段比较查询中没有返回正确的结果

调用未定义的方法 Cake\ORM\Entity::query() CakePhp

为啥使用 Doctrine 而不是 CakePHP 的标准数据库 ORM?

CakePHP 3.0 ORM - 调试工作,翻转直播,抛出错误

如何使用 CakePHP3 ORM 获取字符串格式的 where 子句?