【问题标题】:Cakephp 3 - get fields and conditions in beforefindCakephp 3 - 在 beforefind 中获取字段和条件
【发布时间】:2016-06-19 06:23:09
【问题描述】:

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

在之前查找

public function beforeFind(Event $event, Query $query, $options, $primary)
{
}

options 为空。 $query我可以通过$query->where(...)添加条件,但是如何查看设置了哪些字段要检索或者已经应用了哪些条件呢?

谢谢

【问题讨论】:

    标签: cakephp cakephp-3.x


    【解决方案1】:

    取自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()

    【讨论】:

    • 感谢您的回答,让字段很好,但是对于条件(使用 $parts 的位置)我正在获取具有受保护属性的对象 justpaste.it/rzfo ,有没有更好的/蛋糕方式从中获取条件,或者我应该使用反射类stackoverflow.com/questions/20334355/… 谢谢
    • @dav 你应该检查文档。您正在查看的是调试输出,它不一定反映实际/完整的对象结构。表达式对象也有公共方法,也可以是 traversed/iterated,如果你想检查 WHERE 子句,你必须这样做。
    • @ndm,感谢您的评论,$query->traverse(function ($value, $clause) { $value->iterateParts(function($val) { debug($val->getField()); debug($val->getOperator()); debug($val->getValue()); }); }, ['where']); 得到了它的工作
    • @dav 不要忘记 iterateParts() 的可调用函数应该返回条件 ($val),否则将删除迭代部分,从而更改查询!
    • @ndm,感谢您抽出宝贵时间发表评论,我错过了文档中的那部分。谢谢
    【解决方案2】:

    感谢您的提示,但第 4 版中的“遍历”方法我已经没有这样工作了。 我在 Cake core 里看了看:

    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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多