2016-01-27 3 views
0

Я пытаюсь сделать поисковый запрос для своих блогов веб-сайта с помощью yii2 QueryBuilder, но есть ошибка, подобная этой, когда я пытаюсь выполнить мой запрос с помощью ->all(). вот ошибка: strtr() expects parameter 1 to be string, object given. И вот моя модель и контроллер. Я понятия не имею, что вызывает проблему.Проблема в поиске здания с помощью запроса QueryBuilder yii2

контроллер:

public function actionSearchBlog() 
    { 
     $model = new Blog(); 

     if ($model->load(Yii::$app->request->post())) { 
      Blog::searchBlog($model->search); 
     } else { 
      return $this->render('search',['model' => $model]); 
     } 
    } 

Модель:

public static function searchBlog($search = null) 
    { 
     $search = new Query(); 
     $result = $search->select('id','title','blog','picture') 
      ->from('blog') 
      ->where(['like' , 'title' , $search]) 
      ->orWhere(['like' , 'blog' , $search]) 
      ->all(); 
     echo '<pre>'; 
     var_dump($result); 
     die(); 
    } 

Я попробовал запрос без ->all() в конце, но значение var_dump будет сам запрос и он не будет выполнен. и с ->all() Я получаю эту ошибку.

+1

'$ search = new Query;' и '-> orWhere (['like', 'blog', $ search])'. Вы передаете объект вместо строки. Переименуйте '$ search = new Query;' в '$ query = new Query;' – ineersa

+0

@ineersa Я пытаюсь проверить искомое слово в db с помощью запроса, что еще я могу сделать для выполнения этой задачи? – sobbe

+1

Начать использование хорошей IDE, 'public static function searchBlog ($ search = null)' и '$ search = new Query();'. Вы издеваетесь надо мной или srsly не видите, что не так в вашем коде. – ineersa

ответ

4
public static function searchBlog($search = null) 
{ 
    $query = new Query(); 
    $result = $query->select('id','title','blog','picture') 
     ->from('blog') 
     ->where(['like' , 'title' , $search]) 
     ->orWhere(['like' , 'blog' , $search]) 
     ->all(); 
    echo '<pre>'; 
    var_dump($result); 
    die(); 
} 

Это будет работать. Но начните использовать IDE и смотрите на переменные, которые вы используете.

0

Попробуйте ваш ActiveQuery как: -

$result = (new Query())->select('id','title','blog','picture') 
     ->from('blog') 
     ->where(['like' , 'title' , $search]) 
     ->orWhere(['like' , 'blog' , $search]) 
     ->all(); 

    echo '<pre>'; 
    var_dump($result); 
    die(); 
+0

, как вы видите, я уже создал экземпляр запроса в переменной $ search, так что очевидно, что это не так – sobbe

-1

Вы уверены, что $ поиск строка или массив?

, как: операнда 1 должен быть столбец или выражение БД, и операнд 2 будет строка или массив, представляющий значения, что столбец или выражение БД должно быть. Например, ['like', 'name', 'tester'] будет генерировать name LIKE '%tester%'.

Когда диапазон значений задается как массив, будут генерироваться и объединяться несколько предикатов LIKE с использованием AND. Например, ['like', 'name', ['test', 'sample']] будет генерировать name LIKE '%test%' AND name LIKE '%sample%'. Метод будет правильно указывать имя столбца и сбрасывать специальные символы в значениях.

Иногда, вы можете добавить процентные символы значения соответствия самостоятельно, вы можете поставить третий операнд false в сделать это. Например, ['like', 'name', '%tester', false] будет генерировать имя LIKE '%tester'.

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