Cakephp 3 - 在beforefind中获取字段和条件

dav*_*dav 2 cakephp cakephp-3.x

在beforeFind中的cakephp 2.x中,我可以检查是否设置了某些条件, !empty($queryData['conditions'][$this->alias.'.field'])或者获取将简单地重新获取的字段列表$queryData['fields'].如何在cakephp 3.x中实现这一点?

在beforeFind之前

public function beforeFind(Event $event, Query $query, $options, $primary)
{
}
Run Code Online (Sandbox Code Playgroud)

options是空的.在$query我可以使用添加的条件$query->where(...),但如何检查哪些字段设置为检索或已经应用什么样的条件?

谢谢

bur*_*zum 5

取自CakePHP 3.0 API文档:

traverse( callable $visitor , array $parts [] )
Run Code Online (Sandbox Code Playgroud)

将迭代每个指定的部分.遍历函数可以使用闭包或实例变量中的变量来聚合结果.此函数通常用作遍历将用于构造查询的所有查询部分的方法.

回调将接收2个参数,第一个是正在迭代的查询部分的值,第二个是这个部分的名称.

例:

$query->select(['title'])->from('articles')->traverse(function ($value, $clause) {
    if ($clause === 'select') {
        var_dump($value);
    }
}, ['select', 'from']);
Run Code Online (Sandbox Code Playgroud)

所以只需调用$ query-> traverse()并提供回调闭包并在其中进行检查.另请参见traverseExpressions().

  • @dav你应该查看文档.你正在看的是调试输出,它不一定反映实际/完整的对象结构.表达式对象也有公共方法,可以[**遍历**](http://api.cakephp.org/3.2/class-Cake.Database.Expression.QueryExpression.html#_traverse)/ [**迭代**](http://api.cakephp.org/3.2/class-Cake.Database.Expression.QueryExpression.html#_iterateParts),如果你想检查`WHERE`子句,那就是你要做的. (2认同)
  • @dav不要忘记`iterateParts()`的callable应该返回条件(`$ val`),否则迭代部分将被删除,因此查询被改变了! (2认同)