CakePHP 回调函数如何知道 $q 是一个查询对象以及要在哪个 table 上执行查询?

How do CakePHP callback functions know that $q is a Query object and which table to execute the query on?

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

我可以推测 a) 在 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,特别是关联class / 关联加载器)将以满足其合同的方式调用它。

所以你不能定义任意契约,它是 CakePHP,即指示你的回调必须定义的契约的调用者,因为它以特定的方式调用回调,也就是说它将传递一个查询对象,该对象源于与您在 arguments/options 中传递的别名关联的 table(例如 Authors = AuthorsTableArticles = ArticlesTable).

在所示案例中,回调合同是一个看起来像

的签名
\Cake\Datasource\QueryInterface $query

您的回调必须实现兼容的契约,否则会导致错误。