Красноречивый способ выполнить текстовый поиск только по заданным идентификаторам

#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();