我想创建一个带有搜索表单的产品列表页面,以搜索/过滤结果。我的搜索表允许按产品名称和/或多个SKU编号过滤,或者在产品名称和SKU都为空时列出所有列表。存储在“产品”模型中的产品名称和存储在“ ProductVariant”模型中的SKU。
我希望传递一个产品名称,然后过滤所有产品,例如该名称及其产品变体。返回预期结果。
但传递SKU字符串(例如“ 101,102,103”),然后查询包含SKU的ProductVariant模型ID来过滤产品。但是没有运气不能返回任何记录。
我显示以下模型供参考。
“产品”型号
class Product extends Model
{
public function variants()
{
return $this->hasMany('App\Entities\Products\ProductVariant', 'products_id', 'id');
}
}
“ ProductVariant”模型
class ProductVariant extends Model
{
protected $table = 'products_variant';
public function product()
{
return $this->belongsTo('App\Entities\Products\Product', 'products_id', 'id');
}
}
在ProductsController中,我尝试了这些代码,并使用下面的参数值运行,但没有运气获得期望的结果。
情况1: $ request->带有值的产品名称
情况2: $ request-> sku,其字符串类似于101,102,103
class ProductsController extends Controller
{
public function index(Request $request) {
$productName = $request->product_name;
$sku = explode(',', $request->sku);
$products = Product::with([
'variants' => function ($q) {
$q->orderBy('sku', 'asc');
}
])
->when($request->has('product_name') && isset($request->product_name), function ($q) use ($productName) {
$q->where('name', 'like', '%' . $productName . '%');
})
->when($request->has('sku') && isset($request->sku), function ($q) use ($sku) {
$q->whereHas('variants', $filter = function ($query) use ($sku) {
$query->whereIn('id', $sku);
});
})
->paginate(15);
}
}
我想知道我在上述模型查询中做错了什么。任何人都可以建议如何解决它。谢谢。