首页 > 解决方案 > 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”等内容,我希望查询返回该名称。

标签: laravellaravel-8

解决方案


$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%'");
        });
    });

用户可能会以各种方式搜索名称。我希望它对你有用。


推荐阅读