laravel - Laravel 8 - 如何跨多个字段查询全名中的一部分名称?
问题描述
我在 laravel 中有一个查询,如下所示:
$adeudos = Adeudo::select('adeudo.*', 'adeudo_estatus.estatus', 'prestacion.nombre AS nombrePrestacion', 'vias_recuperacion.via AS viaRecuperacion', 'ente_publico.rfcPatronal AS rfcEnte',
'ente_publico.nombre AS nombreEnte', 'relacion_laboral.numeroEmpleado', 'derechohabiente.rfc', 'derechohabiente.nombre', 'derechohabiente.primerApellido', 'derechohabiente.segundoApellido')
->join('adeudo_estatus', 'adeudo_estatus.id', 'adeudo.idEstatus')
->join('prestacion', 'prestacion.id', 'adeudo.idPrestacion')
->join('vias_recuperacion', 'vias_recuperacion.id', 'adeudo.idViaRecuperacion')
->join('relacion_laboral', 'relacion_laboral.id', 'adeudo.idRelacionLaboral')
->join('derechohabiente', 'derechohabiente.id', 'adeudo.idDerechohabiente')
->join('ente_publico', 'ente_publico.id', 'relacion_laboral.idEnte')
->when($search, function($query, $search){
/*$query = $query->orWhere('derechohabiente.rfc', 'LIKE', '%{$search}%');*/
$query = $query->orWhereRaw("derechohabiente.rfc like '%$search%'");
$query = $query->orWhereRaw("derechohabiente.numeroIssstezac like '%$search%'");
return $query;
});
我想在多个字段中搜索,以防其中一个与 $search 变量匹配。我遇到的问题是进行查询,如果 $search 变量包含“derechohabiente”对象的部分或全部全名,则可以进行过滤。
全名分为多个字段,但有:
- 姓名
- 中间名字
- 姓
因此,如果全名是 John Jeremy Jacobs,如果 $search 变量具有“ohn”、“ohn Jeremy”、“John Jeremy J”等内容,我希望查询返回该名称。
解决方案
$adeudos = Adeudo::select('adeudo.*', 'adeudo_estatus.estatus', 'prestacion.nombre AS nombrePrestacion', 'vias_recuperacion.via AS viaRecuperacion', 'ente_publico.rfcPatronal AS rfcEnte', 'ente_publico.nombre AS nombreEnte', 'relacion_laboral.numeroEmpleado', 'derechohabiente.rfc', 'derechohabiente.nombre', 'derechohabiente.primerApellido', 'derechohabiente.segundoApellido')
->join('adeudo_estatus', 'adeudo_estatus.id', 'adeudo.idEstatus')
->join('prestacion', 'prestacion.id', 'adeudo.idPrestacion')
->join('vias_recuperacion', 'vias_recuperacion.id', 'adeudo.idViaRecuperacion')
->join('relacion_laboral', 'relacion_laboral.id', 'adeudo.idRelacionLaboral')
->join('derechohabiente', 'derechohabiente.id', 'adeudo.idDerechohabiente')
->join('ente_publico', 'ente_publico.id', 'relacion_laboral.idEnte')
->when(!empty($search), function($q, $search) {
$q->where(function($query) use ($input) {
$query->orWhere(DB::raw('CONCAT(derechohabiente.first_name, " ", derechohabiente.middle_name," ",derechohabiente.last_name)'), 'LIKE', '%' . $search . '%')
->orWhere(DB::raw("CONCAT('derechohabiente.first_name', ' ', 'derechohabiente.last_name')"), 'like', '%' . $search . '%')
->orWhere(DB::raw("CONCAT('derechohabiente.last_name', ', ', 'derechohabiente.first_name')"), 'like', '%' . $search . '%')
->orWhere(DB::raw("CONCAT('derechohabiente.first_name', ' ', 'derechohabiente.middle_name', ' ', 'last_name')"), 'like', '%' . $search . '%')
->orWhere(DB::raw("CONCAT('derechohabiente.last_name', ', ', 'derechohabiente.first_name', ' ', 'derechohabiente.middle_name')"), 'like', '%' . $search . '%')
->orWhere('derechohabiente.first_name', 'LIKE', "%{$search}%")
->orWhere('derechohabiente.middle_name', 'LIKE', "%{$search}%")
->orWhere('derechohabiente.last_name', 'LIKE', "%{$search}%")
->orWhereRaw("derechohabiente.rfc like '%$search%'");
});
});
用户可能会以各种方式搜索名称。我希望它对你有用。