如何使用与搜索无关的 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);
我这里有一个 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);