#laravel #laravel-5 #eloquent
#laravel #laravel-5 #красноречивый
Вопрос:
У меня есть таблица с двумя столбцами, которые содержат некоторые текстовые данные. Что я хочу сделать, так это выполнить поиск в этих столбцах, но только по заданным идентификаторам. Пока что я получаю результат для всей базы данных без учета предоставленных идентификаторов. Это потому, что условие orwhere задано неправильно. Я не могу понять, как правильно настроить
$qu = AppAppModelsQuotation::with([
'products.product',
'paymentTerms',
'deliveryTerms',
'company',
'status',
'createdByUser'
]);
if($search_q){
$qu->where( 'name', '=', $search_q )
->orWhere( 'reference', '=', $search_q )
->orWhere( 'name', 'LIKE', '%' . $search_q )
->orWhere( 'name', 'LIKE', '%' . $search_q . '%' )
->orWhere( 'name', 'LIKE', $search_q . '%' )
->orWhere( 'reference', 'LIKE', '%' . $search_q )
->orWhere( 'reference', 'LIKE', '%' . $search_q . '%' )
->orWhere( 'reference', 'LIKE', $search_q . '%' );
}
$quotations = $qu->where('created_at', '>=', $records_from)
->whereIn('id',array_unique($quotation_ids))
->orderBy('created_at','DESC')
->get();
Комментарии:
1. Получаете ли вы правильные результаты, когда не указываете
$search_q
значение?2. да, результаты верны, просто значение where смешивается с условием or, поэтому идентификатор игнорируется
Ответ №1:
Вы можете использовать «группировку параметров» для группировки ваших orWhere
запросов. Итак, вы могли бы сделать:
if($search_q){
$qu = $qu->where(function ($query) {
$query->where( 'name', '=', $search_q )
->orWhere( 'reference', '=', $search_q )
->orWhere( 'name', 'LIKE', '%' . $search_q )
->orWhere( 'name', 'LIKE', '%' . $search_q . '%' )
->orWhere( 'name', 'LIKE', $search_q . '%' )
->orWhere( 'reference', 'LIKE', '%' . $search_q )
->orWhere( 'reference', 'LIKE', '%' . $search_q . '%' )
->orWhere( 'reference', 'LIKE', $search_q . '%' );
});
}
Комментарии:
1. Да, это способ сделать это. я нашел решение. Но спасибо за ответ
Ответ №2:
После еще некоторых исследований я нашел ответ.
$qu = AppAppModelsQuotation::with([
'products.product',
'paymentTerms',
'deliveryTerms',
'company',
'status',
'createdByUser'
])
->whereIn('id',array_unique($quotation_ids));
if($search_q){
$qu->where(function ($query) use($search_q) {
$query->orWhere( 'name', '=', $search_q )
->orWhere( 'reference', '=', $search_q )
->orWhere( 'name', 'LIKE', '%' . $search_q )
->orWhere( 'name', 'LIKE', '%' . $search_q . '%' )
->orWhere( 'name', 'LIKE', $search_q . '%' )
->orWhere( 'reference', 'LIKE', '%' . $search_q )
->orWhere( 'reference', 'LIKE', '%' . $search_q . '%' )
->orWhere( 'reference', 'LIKE', $search_q . '%' );
});
}
$quotations = $qu->where('created_at', '>=', $records_from)
->orderBy('created_at','DESC')
->get();