2016-03-14 32 views
1

大家。

我在蒙戈由下面的查询和使用robomongo测试它 - 它的工作。

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

现在我尝试使用活动记录,以实现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

你缺少的是每个“文档”的意思是$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.*" } 
     } 
    ] 
} 
+0

谢谢,我的朋友,。它的工作,你解释我的错误 - 我不能指望的最好的答案,我真的很感激。 – Bandydan

相关问题