2016-03-14 1 views
1

все.

Я написал следующий запрос в Монго и протестировали его, используя robomongo - это сработало.

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

Теперь я пытаюсь реализовать этот запрос в Yii2 с помощью Active Record:

$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", 

Печать $ test_search с использованием print_r дает мне:

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

Смежные вопросы