[英]How to apply filter with relational table using with statement
我寫了一個代碼來過濾關系數據,但我沒有得到好的結果。 這是代碼。 父查詢和帶查詢是獨立工作的。
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', 'LIKE', "%{$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,
"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": 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', 'LIKE', "%{$search}%");
})
->orderByDesc('created_at');
這將在您的相關表中搜索並在未找到任何內容時返回 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', 'LIKE', "%$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', 'LIKE', "%{$search}%")
->orwhere('last_name', 'LIKE', "%{$search}%");
})->with(['employee' => function ($q){
$q->select('id', 'first_name', 'last_name');
}]);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.