通过多个参数查询包含关系的问题-Laravel

时间:2019-07-17 08:07:59

标签: laravel-5.8 eloquent--relationship

我想创建一个带有搜索表单的产品列表页面,以搜索/过滤结果。我的搜索表允许按产品名称和/或多个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);

   }

}

我想知道我在上述模型查询中做错了什么。任何人都可以建议如何解决它。谢谢。

0 个答案:

没有答案