LIKE в Yii2 Where

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
gbushmakin
Сообщения: 31
Зарегистрирован: 2019.06.20, 12:38

LIKE в Yii2 Where

Сообщение gbushmakin »

Добрый день. Пытаюсь получить из таблицы LIKE %значения%, но почему то ничего не выходит. Как я подозреваю ничего не срабатывает из за нижнего подчеркивания, который в LIKE отвечает за подстановка любого одиночного символа. А мне нужно найти такое значение 0380-20. Когда делаю поиск LIKE просто 0380 - данные появляются.

Вот мой код

Код: Выделить всё

    $test = '0380_20';
    
    $search = Unloading::find()
     	->Where(['like', 'ARTICUL', $test])
    	->all();

print_R($search);
Пробовал так же разные вариации:
%0380_20%
%0380%_%20%
Ничего не выходит...
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: LIKE в Yii2 Where

Сообщение yiiliveext »

gbushmakin писал(а): 2019.10.05, 11:16 Пробовал так же разные вариации:
%0380_20%
%0380%_%20%
Ничего не выходит...

Код: Выделить всё

$test = '0380_20';
    
    $search = Unloading::find()
     	->Where("ARTICUL LIKE '$test'")
    	->all();

print_R($search);
Если это часть текста, то соответственно

Код: Выделить всё

$test = '%0380_20%';
gbushmakin
Сообщения: 31
Зарегистрирован: 2019.06.20, 12:38

Re: LIKE в Yii2 Where

Сообщение gbushmakin »

yiiliveext писал(а): 2019.10.05, 11:41

Код: Выделить всё

$test = '0380_20';
    
    $search = Unloading::find()
     	->Where("ARTICUL LIKE '$test'")
    	->all();

print_R($search);
Если это часть текста, то соответственно

Код: Выделить всё

$test = '%0380_20%';
Сработало. Спасибо. Но а как тогда быть, если это массив с различными значениями? Всё к тому же ARTICUL. В документации было описание этой возможности:
Когда диапазон значений задан в виде массива, несколько LIKE утверждений будут сформированы и соединены с помощью AND. Например, ['like', 'name', ['test', 'sample']] сформирует name LIKE '%test%' AND name LIKE '%sample%'
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: LIKE в Yii2 Where

Сообщение yiiliveext »

gbushmakin писал(а): 2019.10.05, 11:58 Сработало. Спасибо. Но а как тогда быть, если это массив с различными значениями? Всё к тому же ARTICUL. В документации было описание этой возможности:
Когда диапазон значений задан в виде массива, несколько LIKE утверждений будут сформированы и соединены с помощью AND. Например, ['like', 'name', ['test', 'sample']] сформирует name LIKE '%test%' AND name LIKE '%sample%'

Код: Выделить всё

['like', 'name', [new \yii\db\Expression("'%test%'"), new \yii\db\Expression("'%sam_le%'")]]
dmg
Сообщения: 685
Зарегистрирован: 2012.10.15, 03:09

Re: LIKE в Yii2 Where

Сообщение dmg »

gbushmakin писал(а): 2019.10.05, 11:16 Добрый день. Пытаюсь получить из таблицы LIKE %значения%, но почему то ничего не выходит. Как я подозреваю ничего не срабатывает из за нижнего подчеркивания, который в LIKE отвечает за подстановка любого одиночного символа. А мне нужно найти такое значение 0380-20. Когда делаю поиск LIKE просто 0380 - данные появляются.

Вот мой код

Код: Выделить всё

    $test = '0380_20';
    
    $search = Unloading::find()
     	->Where(['like', 'ARTICUL', $test])
    	->all();

print_R($search);
Пробовал так же разные вариации:
%0380_20%
%0380%_%20%
Ничего не выходит...
Странно. У меня экранирует "_"
А если запрос проверить в дебаг панели или так?

Код: Выделить всё

$search = Unloading::find()
     	->where(['like', 'ARTICUL', $test]);
 $sql = $search->createCommand();    	
print_r($sql->rawSql); 
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: LIKE в Yii2 Where

Сообщение yiiliveext »

dmg писал(а): 2019.10.05, 12:56 Странно. У меня экранирует "_"
А если запрос проверить в дебаг панели или так?
Человеку как раз нужно чтобы не экранировался.
dmg
Сообщения: 685
Зарегистрирован: 2012.10.15, 03:09

Re: LIKE в Yii2 Where

Сообщение dmg »

yiiliveext писал(а): 2019.10.05, 13:30
dmg писал(а): 2019.10.05, 12:56 Странно. У меня экранирует "_"
А если запрос проверить в дебаг панели или так?
Человеку как раз нужно чтобы не экранировался.
Тогда по документации так

Код: Выделить всё

->Where(['like', 'ARTICUL', $test,  [ '_' => '_'] ])
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: LIKE в Yii2 Where

Сообщение yiiliveext »

dmg писал(а): 2019.10.05, 15:15
Тогда по документации так

Код: Выделить всё

->Where(['like', 'ARTICUL', $test,  [ '_' => '_'] ])
Можно и так, но надо остальные экранировать, они не мержатся.

Код: Выделить всё

->where(['like', 'ARTICUL', $test, ['%' => '\%', '_' => '_', '\\' => '\\\\'] ])
//символ '_' можно просто опустить
->where(['like', 'ARTICUL', $test, ['%' => '\%', '\\' => '\\\\'] ])
Ну и таким методом вы не запишете

Код: Выделить всё

WHERE name LIKE '%my\\_search\\_str_ng%'
который должен находить my_search_string, но не должен my-search-string
Ответить