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

时间:2016-03-05 12:48:13

标签: 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)
{
}

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

由于

2 个答案:

答案 0 :(得分:5)

取自the CakePHP 3.0 API documentation

traverse( callable $visitor , array $parts [] )
  

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

     

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

     

示例:

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

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

答案 1 :(得分:1)

感谢您的提示,但第四版中的“遍历”方法我已经没有像这样工作了。 我在 Cake 内核中查看了它:

public function beforeFind($event, $query, $options, $primary)
{
    $query
        ->clause('where')
        ->iterateParts(function ($callable) use (&$params): void {
            if ($callable->getField() === 'url') {
                // do something
            }
            $params[] = [
                $callable->getField() . ' ' . $callable->getOperator() => $callable->getValue()
            ];
        });

    $query->where($params);
}