Mysql 对Laravel 5中的表应用多个过滤器

Mysql 对Laravel 5中的表应用多个过滤器,mysql,laravel,eloquent,laravel-5.2,Mysql,Laravel,Eloquent,Laravel 5.2,我有一张桌子。在我的车辆搜索页面中,我根据选择的车型、颜色等过滤车辆 在我的代码中,我尝试实例化车辆模型。然后将筛选器应用于它,并尝试使用get()运行查询,但向我提供了错误信息 代码如下: $vehicles = Vehicle::all(); if($request->input('model')) { $vehicles->whereHas('model', function($q) { $q-&g

我有一张桌子。在我的车辆搜索页面中,我根据选择的车型、颜色等过滤车辆

在我的代码中,我尝试实例化车辆模型。然后将筛选器应用于它,并尝试使用get()运行查询,但向我提供了错误信息

代码如下:

    $vehicles = Vehicle::all();
    if($request->input('model'))
    {
        $vehicles->whereHas('model', function($q)
        {
            $q->where('model_name', '=', 'CL');

        });

    }
    if($request->input('color'))
    {
        $vehicles->where('color', '=', 'red');
    }
    // other filters here
    $result = $vehicles->get();
    dd($result);
在这里,如果我直接在车辆模型上使用whereHas,如Vehicle::whereHas(),则单个过滤器可以工作。如果我必须根据条件应用多个过滤器,解决方案是什么。
谁拯救了我的一天:)

我不认为
$vehicles=Vehicle::all()
是先加载数据然后应用过滤器的最佳方法。如果有大量记录,这可能会影响性能,因为您正在加载表中的所有数据,包括不必要的记录

请尝试以下多种情况:

$vehicles = Vehicle::where(['model_name'=>'CL','color'=>'red'])->get(); //color is just an assumption. This way you can use multiple conditions.
dd($vehicles);

我希望这能有所帮助。

我不认为
$vehicles=Vehicle::all()
是先加载数据然后应用过滤器的最佳方法。如果有大量记录,这可能会影响性能,因为您正在加载表中的所有数据,包括不必要的记录

请尝试以下多种情况:

$vehicles = Vehicle::where(['model_name'=>'CL','color'=>'red'])->get(); //color is just an assumption. This way you can use multiple conditions.
dd($vehicles);

我希望这会有所帮助。

因此,基本上您需要做的就是拥有一个包含过滤器的
$conditions
数组,例如:

$conditions = collect([]);
$conditions->push($request->only(['model_name', 'color', 'year', 'valueMin', 'valueMax']'));
这将生成一个
集合
,其中仅包含
型号、颜色、年份、valueMin
valueMax
属性中的
键=>值
对(可能来自某种形式?)

然后,您只需将该集合传递给您的查询,如下所示:

Vehicle::where(function($q) use ($conditions){
    if ($conditions->has('color')) {
        $q->where('color', $conditions->get('color'));
    }

    return $q;
})->whereHas('model', function($q) use ($conditions) {
    return $q->where($conditions->toArray());
})->get();
这样,您就不必担心在查询中硬编码您的条件,您可以有一个永无止境的限制。在进行直接比较时,只需传入一个带有键值对的数组


此解决方案将允许进行您正在寻找的动态属性比较。

因此,您需要做的基本上就是拥有一个包含过滤器的
$conditions
数组,例如:

$conditions = collect([]);
$conditions->push($request->only(['model_name', 'color', 'year', 'valueMin', 'valueMax']'));
这将生成一个
集合
,其中仅包含
型号、颜色、年份、valueMin
valueMax
属性中的
键=>值
对(可能来自某种形式?)

然后,您只需将该集合传递给您的查询,如下所示:

Vehicle::where(function($q) use ($conditions){
    if ($conditions->has('color')) {
        $q->where('color', $conditions->get('color'));
    }

    return $q;
})->whereHas('model', function($q) use ($conditions) {
    return $q->where($conditions->toArray());
})->get();
这样,您就不必担心在查询中硬编码您的条件,您可以有一个永无止境的限制。在进行直接比较时,只需传入一个带有键值对的数组

此解决方案将允许进行您正在寻找的动态属性比较。

尝试以下方法:

 $vehicles = new Vehicle();
        if($request->input('model'))
        {
           $vehicles =  $vehicles->whereHas('model', function($q)
            {
                $q->where('model_name', '=', 'CL');

            });

        }
        if($request->input('color'))
        {
           $vehicles = $vehicles->where('color', '=', 'red');
        }
        // other filters here
        $result = $vehicles->get();
        dd($result);
试试这个:

 $vehicles = new Vehicle();
        if($request->input('model'))
        {
           $vehicles =  $vehicles->whereHas('model', function($q)
            {
                $q->where('model_name', '=', 'CL');

            });

        }
        if($request->input('color'))
        {
           $vehicles = $vehicles->where('color', '=', 'red');
        }
        // other filters here
        $result = $vehicles->get();
        dd($result);


问题在于,它假定始终存在模型名称和颜色。如果没有,会发生什么?在这种情况下,如果条件中有大量的if和else,我们可以使用
QueryBuilder
。@ohgod为什么这很好,我们可以基于where()中的现有参数创建数组。但这仅在model_名称和颜色是vehicle表的列时有效。如果车型名称在表中,车型和颜色在表中,车辆会怎样?是的,我们可以这样做。问题是,它假设始终存在车型名称和颜色。如果没有,会发生什么?在这种情况下,如果条件中有大量的if和else,我们可以使用
QueryBuilder
。@ohgod为什么这很好,我们可以基于where()中的现有参数创建数组。但这仅在model_名称和颜色是vehicle表的列时有效。如果车型名称在“车型”表中,颜色在“车辆”表中,该怎么办?是的,我们可以这样做:车型名称在“车型”表中,可以使用Where Has进行过滤,但颜色在“车辆”表中。我需要根据是否存在输入应用这些。根据到达的输入,可能还需要应用多个whereHas。@mirzavu已更新,以支持对父表进行进一步的
where
筛选,并允许对相关表进行
whereHas
筛选。查询现在起作用了,我建议对collect进行编辑以使其起作用!请接受编辑并将其标记为ans。非常感谢much@mirzavu很遗憾,我在手机上看不到它,但我会在回去工作时检查我的桌面并应用你的编辑。很高兴它帮你分类了!没有问题。现在我学到了更多的东西。你能帮我调查一下吗?模型名称位于模型表中,可以使用wherehas进行过滤,但颜色位于vehicles表中。我需要根据是否存在输入应用这些。根据到达的输入,可能还需要应用多个whereHas。@mirzavu已更新,以支持对父表进行进一步的
where
筛选,并允许对相关表进行
whereHas
筛选。查询现在起作用了,我建议对collect进行编辑以使其起作用!请接受编辑并将其标记为ans。非常感谢much@mirzavu很遗憾,我在手机上看不到它,但我会在回去工作时检查我的桌面并应用你的编辑。很高兴它帮你分类了!没有问题。现在我学到了更多的东西。你能帮我调查一下吗?这个有用!!但是@Ohgodwhy有一个高级版本的答案这个有用!!但是@Ohgodwhy有一个高级版本的答案