В моей базе данных у меня есть столбец id, который может содержать целое число, строку, целое + строковое значение. например, проверьте это изображение:
Как вы можете видеть в столбце id, у меня есть что-то вроде этого значения:
идентификатор продукта
PPAETRABN018283
Итак, в поле ввода (моя форма поиска) -
Если я ввожу продукт, я могу получить результат, так как в качестве идентификатора есть значение идентификатора продукта.
Если я ввожу PPAE, я могу получить результат, так как в качестве идентификатора есть значение PPAETRABN018283.
НО
Если я ввожу 182, я не могу получить никакого результата, хотя я использую LIKE
. Можешь мне сказать почему?
И
У меня есть еще один столбец, называемый доступностью, который содержит истину и ложь как логическое значение. Если я выполняю поиск с true, я могу получить результат, но я выполняю поиск с false, я не могу получить результат. Можешь мне сказать почему?
Вот мой код:
$trimmed_array = $request->all();
$whereLike = $whereIn = $where = [];
foreach( $trimmed_array as $k => $v ) {
if ( $k !== 'page' && $k !== 'projectToken' && $k !== 'userId' ) {
if ( !empty( $v ) ) {
if ( is_numeric( $v) ) {
$whereIn[] = [$k, (int) $v];
} elseif ( trim( strtolower($v)) == 'false' || trim(strtolower($v)) == 'true') {
$where[] = [$k, $v ];
} else {
$whereLike[] = [$k, 'LIKE', '%'. $v .'%' ];
}
}
}
}
$projectToken = $request->input('projectToken');
$userId = $request->input('userId');
$this->set_connection( $projectToken, $userId );
$get_project_id = DB::connection('mysql')->table('projects')->where('token', $projectToken )->get(['id_project'])->first();
$collection = 'products_' . $get_project_id->id_project;
$collection = 'products_105';
$search = DB::connection('mongodb')->collection( $collection );
if ( count( $whereIn) ) {
foreach( $whereIn as $array ) {
$key = $array[0];
$value = (int) $array[1];
$search->whereIn($key, [$value]);
}
}
if ( count( $whereLike) ) {
$search->where($whereLike);
}
if ( count( $where ) ) {
foreach( $where as $arr ) {
$key = $arr[0];
$value = (bool) $arr[1];
$search->where($key, $value);
}
}
$search = $search->paginate(100);
return response()->json( [ 'product_value' => $search ], 200);
В таких случаях мы используем LIKE
с переносом %
, например:
$needle = ...; // What to find (User's input).
$query = ...;
$query->where('myColumn', 'like', '%' . $needle . '%');
И если вы ищете в нескольких столбцах, попробуйте:
$needle = ...;
$query = ...;
// List search target.
$columns = ['myFirstColumn', 'myOtherColumn'];
$pattern = '%' . $needle . '%';
foreach ($columns as $name) {
$query = $query->orWhere($name, 'like', $pattern);
}
Обратите внимание, что если третий параметр метода
where(...)
не установлен, Laravel по умолчанию автоматически использует оператор условия «=
» в запросе, в то время как выше вместо этого используется «LIKE
».
Спасибо, хотя я нашел решение. Работает с
orWhere