Laravel:orWhereHas() 不尊重 where()

问题描述 投票:0回答:1
$q = $request->query('q');

$faktur = FakturKonsinyasi::with(['indukbuku', 'distributor'])
  ->where('qty', '<>', 0)
  ->where('id_faktur_konsinyasi', 'like', '%' . $q . '%')
  ->where('id_faktur_konsinyasi', 'like', 'FKTKNST%')
  ->orderBy('id_faktur_konsinyasi', 'ASC');

if(!str_contains($q,'FKTKNST') && !empty($q)) {
      $faktur = $faktur->whereHas('indukbuku', function ($query) use ($q) {
      $query->where('judul_buku',  'like', '%' . $q . '%');
    })->orWhereHas('distributor', function ($query) use ($q) {
      $query->where('nm_distributor',  'like', '%' . $q . '%');
    });
}

$faktur = $faktur->paginate(10);

上面的代码不起作用。我想通过 id_faktur_konsinyasi 过滤 $faktur,id 从“FKTKNST”开始,如果 id_faktur_konsinyasi 只有两个条件,它就可以工作。但是,当添加这两个 whereHa 时,where 外部条件块中的所有内容都将被忽略。

浏览,当然包括人工智能,他们的结果都不起作用。

php laravel database eloquent
1个回答
0
投票

发生这种情况是因为您混合了“与”和“或”条件。

尝试隔离他们...

$q = $request->query('q');

$faktur = FakturKonsinyasi::with(['indukbuku', 'distributor'])
    ->where('qty', '<>', 0)
    ->where('id_faktur_konsinyasi', 'like', '%' . $q . '%')
    ->where('id_faktur_konsinyasi', 'like', 'FKTKNST%')
    ->orderBy('id_faktur_konsinyasi', 'ASC');

if(!str_contains($q,'FKTKNST') && !empty($q)) {
    $faktur->where(function ($builder) use ($q) {
        $builder->whereHas('indukbuku', function ($query) use ($q) {
            $query->where('judul_buku',  'like', '%' . $q . '%');
        })->orWhereHas('distributor', function ($query) use ($q) {
            $query->where('nm_distributor',  'like', '%' . $q . '%');
        });
    });
}

$faktur = $faktur->paginate(10);
© www.soinside.com 2019 - 2024. All rights reserved.