如何使用with语句

问题描述

我写了一个代码来过滤关系数据,但是没有得到很好的结果。这是代码。父查询和带有查询查询是独立工作的。

public function get(Request $request,Company $company,Survey $survey)
{
    $this->authorize('update',$survey->company);
    $search = $request->get('search');
    $query = EsAnswer::where(['company_id' => $company->id,'survey_id' => $survey->id])
        ->orderByDesc('created_at')
        ->with(['employee'=> function ($q) use($search) {
            $q->where('first_name','LIKE',"%{$search}%");
            $q->orwhere('last_name',"%{$search}%");
            $q->select('id','first_name','last_name');   
        }]);
    if ($request->has('start_date')) {
        $query->whereDate('created_at','>=',$request->start_date);
    }
    if ($request->has('end_date')) {
        $query->whereDate('created_at','<=',$request->end_date);
    }

    $answers = $query->get()->groupBy('submission_id');
        // ->paginate('100');
    return $answers;
}

当我使用这个

{
    "search":""
}

我收到此回复

{
    "id": 2,"company_id": 1,"employee_id": 1,"survey_id": 2,"es_question_id": 1,"answer": "done","submission_id": "1","mark_as_read": 1,"created_at": "2020-08-19 12:18:25","updated_at": "2020-08-26 06:55:21","employee": {
        "id": 1,"first_name": "Baseapp","last_name": "saw"
    }
}

当我尝试按另一个表中存在的员工姓名进行搜索时,如果存在数据,则应过滤数据并给出响应,但如果不存在员工姓名或搜索数据,则数据不应给出任何响应。如何处理?

{
    "search":"sure"
}


{
    "id": 2,"employee": null
}

此处数据为空,但为何显示父数据。请帮忙,并提出另一个想法来过滤关系数据。

解决方法

我们使用whereHas在相关表格中进行过滤。所以像这样

$query = EsAnswer::with('employee:id,first_name,last_name')
        ->where(['company_id' => $company->id,'survey_id' => $survey->id])
        ->whereHas('employee',function($query) use($search) {
            $query->where('first_name','LIKE',"%{$search}%")
                ->orwhere('last_name',"%{$search}%");
        })
        ->orderByDesc('created_at');

这将在您的相关表中搜索,如果找不到任何内容,则返回null。并且我为eager load数据添加了优雅的方式。您也应该检查一下。

,

使用whereHas()函数

  $query = EsAnswer::with('employee:id,"%$search%")
                ->orwhere('last_name',"%$search%");
        })
        ->orderByDesc('created_at');

参考链接https://laravel.com/docs/7.x/eloquent-relationships#querying-relationship-existence

,

它使用wherehas,然后使用:

$query = EsAnswer::where(['company_id' => $company->id,'survey_id' => $survey->id])
    ->orderByDesc('created_at')
    ->whereHas('employee',function ($q) use($search) {
      return $q->where('first_name',"%{$search}%")
      ->orwhere('last_name',"%{$search}%");   
    })->with(['employee' => function ($q){
        $q->select('id','first_name','last_name');
    }]);

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...