如何使用与搜索无关的 orWhere 子句在 Livewire 上呈现搜索?

How can I render search on Livewire with an orWhere clause not related to search?

我这里有一个 Livewire 渲染函数,它根据在文本框中搜索的内容显示记录。它工作正常,并以自动完成的方式给我结果。但是,当我添加此行 ->orWhere('qty_on_hand', '!=', 0) 时,它会停止自动完成搜索。

 <?php
    
    namespace App\Http\Livewire;
    
    use Livewire\Component;
    use App\Models\Product;
    
    class LoadInStockProducts extends Component
    {
        public $searchTerm;
        public $amount = 10;
    
        protected $listeners = [
            'load-more' => 'loadMore'
        ];
       
        public function loadMore()
        {
            $this->amount = $this->amount + 10;
        }
    
        public function render()
        {
            $searchTerm = '%' . $this->searchTerm . '%';
            
            $products = Product::orderBy('name')->where('code', 'like', $searchTerm)
                        ->orWhere('name', 'like', $searchTerm)
                        ->orWhere('description', 'like', $searchTerm)
                        ->orWhere('qty_on_hand', '!=', 0)
                        ->paginate($this->amount);
    
            $this->emit('productStore');
            
            return view('livewire.load-in-stock-products', ['products' => $products]);
        }
    }

即使在 ->orWhere('qty_on_hand', '!=', 0) 条件下,我怎样才能使自动完成搜索工作?另外,还有一个问题,我试过这个 ->orWhere('srp', '!=', 0.00) 但它不起作用。我怎样才能让它适用于浮点类型? srp 字段是 float 类型。

非常感谢任何帮助。

在我看来,您想生成一个查询,在其中搜索给定字段,并且只显示手头有数量的记录 - 在原始 SQL 中看起来像这样,

SELECT *
FROM products
WHERE (
      code LIKE '%searchterm%'
      OR name LIKE '%searchterm%'
      OR description LIKE '%searchterm%'
   )
   AND qty_on_hand != 0
ORDER BY name

请注意 code/name/description 的搜索是如何在其自己的组内进行的,并且您会查找数量不为零的 中任何一个的匹配项.

在 Laravel 中,这意味着您还必须使用闭包对查询进行分组。

$products = Product::where(function($query) use ($searchTerm) {
        return $query->where('code', 'like', $searchTerm)
            ->orWhere('name', 'like', $searchTerm)
            ->orWhere('description', 'like', $searchTerm);
    })
    ->where('qty_on_hand', '!=', 0)
    ->orderBy('name')
    ->paginate($this->amount);

如果有其他条件可以引入更多组,比如有两个where()带闭包,里面的查询使用orwhere().

$products = Product::where(function($query) use ($searchTerm) {
        return $query->where('code', 'like', $searchTerm)
            ->orWhere('name', 'like', $searchTerm)
            ->orWhere('description', 'like', $searchTerm);
    })
    ->where(function($query) {
        return $query->where('qty_on_hand', '!=', 0)
            ->orWhere('srp', '!=', 0);
    })
    ->orderBy('name')
    ->paginate($this->amount);