MongoDb,Yii2,Active Record:$或需要一个数组

时间:2016-03-14 15:17:28

标签: php mongodb yii2 mongodb-query

大家。

我在 mongo 中编写了以下查询,并使用 robomongo 对其进行了测试 - 它运行良好。

db.customers.find({$or: [
    {emailaddress: /.*test.*/},
    {address: /.*test.*/},
    {firstname: /.*test.*/}
]})

现在我尝试使用Active Record在Yii2中实现此查询:

$fields = [];
$search = '/.*' . $search . '.*/';//in $search was the word 'test'

foreach($this->searchFields as $field) {
    $fields["$field"] = "$search";
}
$text_search = [ '$or' => ['$search' => $fields]];

$query = $query->where($text_search);

$provider = new ActiveDataProvider([
    'query' => $query,
]);

在添加$或之前有效,现在它给了我一个错误:

"name": "MongoDB Exception",
"message": "Cannot run command count(): exception: $or needs an array",
"code": 20,
"type": "yii\\mongodb\\Exception",

使用print_r打印$ test_search会给我:

Array
(
    [$or] => Array
    (
        [$search] => Array
        (
            [emailaddress] => : /.*test.*/
            [address] => : /.*test.*/
            [firstname] => : /.*test.*/
        )
    )
)

如果我删除'$search' =>并仅保留

$text_search = [ '$or' => [$fields]];
它给了我:

{
    "recordsTotal": 0,
    "recordsFiltered": 0,
    "data": []
}

有谁知道如何使此查询在Active Record中运行?请给我一些想法。

提前致谢。

1 个答案:

答案 0 :(得分:2)

您缺少每个“文档”都是$or数组的成员,因为它是自己的条件。您正在使用不同的密钥创建单个文档。

此外,你不能使用像这样的“字符串”的正则表达式。而是使用$regex查询运算符,只使用表达式的字符串。

取而代之的是:

$search = '.*' . $search . '.*';
$text_search = [ '$or' => [] ];

foreach($this->searchFields as $field) {
    array_push( $text_search['$or'], [ $field => [ '$regex' => "$search" ] ] );
}

$query = $query->where($text_search);

此外,当您与JSON进行比较时,输出为JSON编码以进行调试:

echo json_encode( $text_search, JSON_PRETTY_PRINT ) . "\n";

你不会出错,因为你会看到它是否相同:

{
    "$or": [
        {
            "emailaddress": { "$regex": ".*test.*" }
        },
        {
            "address": { "$regex": ".*test.*" }
        },
        {
            "firstname": { "$regex": ".*test.*" }
        }
    ]
}