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
= AuthorsTable
、Articles
= ArticlesTable
).
在所示案例中,回调合同是一个看起来像
的签名
\Cake\Datasource\QueryInterface $query
您的回调必须实现兼容的契约,否则会导致错误。
我正在尝试了解一些基本功能,但不确定它属于哪个主题。我在 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
= AuthorsTable
、Articles
= ArticlesTable
).
在所示案例中,回调合同是一个看起来像
的签名\Cake\Datasource\QueryInterface $query
您的回调必须实现兼容的契约,否则会导致错误。