Laravel orWhere导致其他where查询被忽略



我必须使用三个不同的表输出数据,并且它们必须满足特定的条件。

->where('borrows.late_return_status', '=', 1)
->where('borrows.return_date', '=', null)

但是,我还需要允许用户使用name或IC在列表中搜索。

->where('borrowers.borrower_name', 'like', '%'.$search.'%')
->orWhere('borrowers.IC', 'like', '%'.$search.'%')

我的问题是,当满足orWhere条件时,甚至忽略了必要的条件,并且它显示没有late_return_status的数据为1。

这是完整的代码。

$late_books = Borrow::join('books', 'borrows.book_id', '=', 'books.id')
    ->join('borrowers', 'borrows.borrower_id', '=', 'borrowers.id')
    ->where('borrowers.borrower_name', 'like', '%'.$search.'%')
    ->orWhere('borrowers.IC', 'like', '%'.$search.'%')
    ->where('borrows.late_return_status', '=', 1)
    ->where('borrows.return_date', '=', null)
    ->get([
        'borrowers.borrower_name', 'borrowers.IC', 'borrowers.phone_no', 
        'books.ISBN', 'books.book_title', 'books.year',
        'books.author', 'books.publisher_name',
        'borrows.issue_date', 'borrows.due_date'
    ]);

您需要的是将搜索条件括在圆括号中。

您可以使用逻辑分组(https://laravel.com/docs/9.x/queries#logical-grouping)来实现这一点。

$late_books = Borrow::join('books', 'borrows.book_id', '=', 'books.id')
    ->join('borrowers', 'borrows.borrower_id', '=', 'borrowers.id')
    ->where('borrows.late_return_status', '=', 1)
    ->where('borrows.return_date', '=', null)
    ->where(function ($query) use ($search) {
      $query->where('borrowers.borrower_name', 'like', '%'.$search.'%')
        ->orWhere('borrowers.IC', 'like', '%'.$search.'%')
    })
    ->get(['borrowers.borrower_name', 'borrowers.IC', 'borrowers.phone_no' ,'books.ISBN', 'books.book_title', 'books.year','books.author', 'books.publisher_name',
           'borrows.issue_date', 'borrows.due_date']);

相关内容

  • 没有找到相关文章