雄辩的方式来仅在给定的ID上执行文本搜索文本

时间:2019-03-07 07:44:06

标签: laravel laravel-5 eloquent

我有一个包含两列的表格,其中包含一些文本数据。 我想做的是搜索这些列,但仅搜索给定的ID。 到目前为止,无论提供的ID如何,我都能获得整个数据库的结果。这是因为orwhere条件设置错误。 我不知道如何正确设置

   $qu = \App\AppModels\Quotation::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();

2 个答案:

答案 0 :(得分:2)

您可以使用“参数分组”对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 :(得分:0)

经过更多研究,我找到了答案。

  $qu = \App\AppModels\Quotation::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();