【问题标题】:Laravel Eloquent - not retrieving required rowsLaravel Eloquent - 不检索所需的行
【发布时间】:2018-12-15 11:07:59
【问题描述】:

利用应用程序上的搜索框,数据库有2个表格,如下所示:

 ________________
|**Services**
 ________________
|=>id
|=>name
|=>description
|=>other_columns
________________

和:

 ________________
|**Products**
 ________________
|=>id
|=>name
|=>description
|=>service_id
|=>other_columns
________________

=>每个服务包含许多产品

=>由于搜索框的形式:

用户可以搜索 products 的单词并可选地选择一个服务,因此,我用来检索结果的 eloquent:

  1. 如果用户没有选择特定服务进行搜索:

    $data = Product::where('name','like',"%$search_value%")
            ->orWhere('description','like',"%$search_value%")
            ->orWhere('description_long','like',"%$search_value%")
            ->paginate($items_per_page);
    
  2. 如果用户确实选择了特定服务

    $data = Product::where([
                ['name','like',"%$search_value%"],
                ['service_id','=',"%$service%"],
            ])
            ->orWhere([
                ['description','like',"%$search_value%"],
                ['service_id','=',"%$service%"],
            ])
            ->orWhere([
                ['description_long','like',"%$search_value%"],
                ['service_id','=',"%$service%"],
            ])
            ->paginate($items_per_page);
    

模型关系如下:

  1. 产品型号:

    public function service(){
        return $this->belongsTo(Service::class);
    }
    
  2. 服务型号:

    public function products(){
        return $this->hasMany(Product::class);
    }
    

在这两种情况下,$data 始终包含所有产品行。如何获得正确的结果?

【问题讨论】:

  • whereRaw代替where。
  • 我已经阅读了whereRaw 的文档,但是你能解释一下区别吗?
  • WhereRaw() 是 Laravel 查询构建器的一个函数,它将您的输入原样放在 SQL 查询的 where 子句中。将其视为 where() 函数,其输入参数在插入查询之前不会被处理。
  • 为什么还要在= 行中使用百分号?
  • 为什么 service_id 在这些['service_id','=',"%$service%"] 中有%?不应该是这样['service_id','=',$service]吗?

标签: laravel laravel-5 model eloquent


【解决方案1】:

['service_id','=',"%$service%"]中有%,应该删除['service_id','=',$service]

%LIKE 一起使用,而不与 = 一起使用。

【讨论】:

  • 如果您正在寻找改进搜索的方法,请查看package
【解决方案2】:

您可以使用when() 根据您的用户输入构建动态查询。

$data = Product::query()
    ->when($request->get('service_id') ,function($query, $service_id) {
        $query->where('service_id', $service_id);
    })
    ->where(function($query) use ($search_value) {
        $query->where(('name', 'like', "%$search_value%"))
            ->orWhere('description', 'like', "%$search_value%")
            ->orWhere('description_long', 'like', "%$search_value%");
    })
    ->paginate($items_per_page);

通过将全文搜索条件嵌套在另一个where() 子句中,我们不必多次重复where('service_id', $service_id) 部分。

如果您在前端使用All Services 选择选项和value="all",您也可以使用下面的when() 子句代替上面的:

->when($request->filled('service_id') && $request->get('service_id') !== 'all', function ($query) use ($request) {
    $query->where('service_id', $request->get('service_id'));
})

【讨论】:

    猜你喜欢
    • 2018-02-16
    • 1970-01-01
    • 2019-03-04
    • 1970-01-01
    • 2016-09-12
    • 1970-01-01
    • 1970-01-01
    • 2014-09-08
    • 2013-01-30
    相关资源
    最近更新 更多