【问题标题】:Trying to search in a model via eloquent - laravel with optimal parameters尝试通过 eloquent 在模型中搜索 - 具有最佳参数的 laravel
【发布时间】:2020-01-22 04:36:51
【问题描述】:

我试图弄清楚为什么我的查询忽略了除标题和描述之外的所有内容。指向控制器的搜索按钮用于按类别、按地区、按价格过滤不同类型的广告。 例如,如果我现在搜索现有广告,并且通过标题/关键字找到它 -> 将始终显示,即使我选择不同的地区/类别/价格范围

我正在尝试使用可以为我节省大量 if 语句的东西来检查它们是否存在于请求中。也许其他选项可以使用https://github.com/mohammad-fouladgar/eloquent-builder 来构建我的查询

 public function index(Request $request)
    {
        $keyword = $request['keyword'];
        $category_id = $request['category_id'];
        $type_id = $request['type_id'];
        $region_id = $request['region_id'];
        $min_price = $request['min_price'];
        $max_price = $request['max_price'];


        $result = Ad::when($keyword, function ($q) use ($keyword) {
            return $q->where('title', 'like', '%' . $keyword . '%')->orWhere('description', 'like', '%' . $keyword . '%');
        })
            ->when($category_id, function ($q) use ($category_id) {
                return $q->where('category_id', $category_id);
            })
            ->when($region_id, function ($q) use ($region_id) {
                return $q->where('region_id', '=', $region_id);
            })
            ->when($type_id, function ($q) use ($type_id) {
                return $q->where('adtype_id', '=', $type_id);
            })
            ->when($min_price, function ($q) use ($min_price) {
                return $q->where('price', '>=', $min_price);
            })
            ->when($max_price, function ($q) use ($max_price) {
                return $q->where('price', '<=', $max_price);
            })
            ->paginate(8);

我的获取参数 url 如下所示: search?keyword=&category_id=0&region_id=0&type_id=0&min_price=&max_price=

当我按名称搜索现有广告并寻找不同类别时,mysql 中生成的查询是:

select * from `ads` where `title` like '%test test%' or `description` like '%test test%' and `category_id` = '2' limit 8 offset 0

找到了广告,但实际类别是 1,而不是 2,其他所有最佳参数都相同。

【问题讨论】:

  • 您的所有查询(类别、区域、类型)是否都包含在单个表中?
  • 都是相关的,但是id-s在当前表中,是的
  • 那么例如,Ad belongsTo / has category?
  • 是的,category、condition、region,它们是通过 belongsTo 关联的

标签: php laravel search eloquent


【解决方案1】:

您可以使用whereHas 编辑查询以查找特定关系。此方法将允许您将自定义约束添加到关系约束,例如检查评论的内容。要检查最高/最低价格,请使用where 方法。所以,你可以这样使用它:

$result = Ad::when($keyword, function ($q) use ($keyword) {
            return $q->where('title', 'like', '%' . $keyword . '%')->orWhere('description', 'like', '%' . $keyword . '%');
        })
            ->whereHas('category_relation_name', function ($q) use ($category_id) {
                return $q->where('category_id', $category_id);
            })
            ->whereHas('region_relation_name', function ($q) use ($region_id) {
                return $q->where('region_id', $region_id);
            })
            ->whereHas('type_relation_name', function ($q) use ($type_id) {
                return $q->where('adtype_id', $type_id);
            })
            ->where('price', '>=', $min_price);
            ->where('price', '<=', $max_price);
            ->paginate(8);

【讨论】:

  • 您好,谢谢您的回答。我得到`InvalidArgumentException 非法运算符和值组合。`。很可能是因为其他最优参数的 $request 为空,
  • 我的错,编辑了答案,忘记删除“=”符号
  • 谢谢,我也删除了它们——为了测试——同样的事情。这对来自 $request 的空变量是否安全?
  • select count(*) as aggregate from ads` where title like '%test%' 或 description like '%test%' 并且存在(从categories select * where ads.category_id = categories.idcategory_id = '0')并且存在(从regions 中选择 * 其中ads.region_id = regions.idregion_id = '0' ) 并且存在(从ad_types 中选择*,其中ads.adtype_id = ad_types.idadtype_id = '0')和price >= 10 和price
  • 您的请求似乎已通过,但您的所有值都是 0。请检查您的表单,也许您那里有问题。
猜你喜欢
  • 1970-01-01
  • 2017-05-28
  • 2021-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-13
  • 2023-03-31
  • 1970-01-01
相关资源
最近更新 更多