CakePHP回调函数如何知道$ q是一个Query对象,哪个表执行查询?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CakePHP回调函数如何知道$ q是一个Query对象,哪个表执行查询?相关的知识,希望对你有一定的参考价值。

我正在尝试理解一些基本功能,但我不确定它究竟属于哪个主题。我在Cakephp工作,我试图理解这些嵌套回调函数似乎只是知道它们应该做什么。我认为我的很多问题是我不知道要搜索哪些关键字所以我的问题是:CakePHP关联中的匿名函数如何知道a)参数$ q是一个Query对象而b)是哪个模型的应该查询?

我可以推测在CakePHP中有一个地方,其中匿名函数被告知使用第一个参数$ q作为查询和b)一些处理程序遍历对象并假设它找到的任何回调函数,无论它们嵌套多深,正在查询它最直接嵌套的模型,但我似乎无法找到任何文档(或搜索的关键字)来理解其中任何一个应该如何以及为什么起作用。

示例1 - 这个知道$ q是一个查询,它是AuthorsTable的

$query = $articles->find()->contain([
    'Authors' => [
        'foreignKey' => false,
        'queryBuilder' => function ($q) {
            return $q->where(...); // Full conditions for filtering
        }
    ]
]);

示例2 - 这个知道$ q正在查询ArticlesTable

$query = $authors->find();
$query->matching('Articles', function ($q) {
    return $q->where(['Articles.created >=' => new DateTime('-10 days')]);
}); 

提前谢谢......如果这个问题的答案可以在S.O.上找到,我会道歉。别的地方;我确定我找不到它的原因是因为我不知道使用什么特殊词。

答案

这就是事情的工作原理,不仅仅是特定的CakePHP选项如何工作,还有PHP如何工作。该函数不知道任何事情,它所能做的就是希望调用者(CakePHP,特别是关联类/关​​联加载器)将以满足其契约的方式调用它。

所以你不能定义任意契约,它是CakePHP,即调用者指定你的回调必须定义的契约,因为它以特定的方式调用回调,即它将传递一个查询对象,它来自表与您在参数/选项中传递的别名相关联(例如Authors = AuthorsTableArticles = ArticlesTable)。

在所示的情况下,回调的合同是一个看起来像的签名

\Cake\Datasource\QueryInterface $query

您的回调必须实现兼容的合同,否则将导致错误。

以上是关于CakePHP回调函数如何知道$ q是一个Query对象,哪个表执行查询?的主要内容,如果未能解决你的问题,请参考以下文章

cakephp3 如何检查实体是不是是新插入的 afterSave 回调?

如何在 CakePhp 组件中调用回调?

这个回调如何对 cakePHP 组件起作用?

Cakephp3 ElasticSearch查询Q

CakePHP 3.x ORM get()、find() 以及如何禁用befeoreFind()?

CakePHP 3 - beforeSave 回调在编辑时不起作用