如何在Laravel DB :: table查询中preg_replace内容?

时间:2019-04-17 03:48:55

标签: php laravel laravel-5 eloquent

我想用 $ keyword 替换输入搜索框中与关键字匹配的文本。我不知道为什么它不起作用。请查看代码并为我提供帮助。

我正在使用PHP 7.X和Laravel 5.7。

$items = DB::table('element_designs')
                ->join('elements', function($join){
                    $join->on('element_designs.id', '=', 'elements.element_design_id')
                        ->where('elements.deleted_at', null);
                })
                ->leftJoin('locations', function($join){
                    $join->on('elements.location_id', '=', 'locations.id')
                        ->where('locations.disable_flg', false);
                })
                ->leftJoin('areas', function($join){
                    $join->on('elements.area_id', '=', 'areas.id')
                        ->where('areas.disable_flg', false);
                })
                ->where('element_designs.disable_flg', false)
                ->where(function($query) use ($keyword){
                    $query->where('element_designs.element_name', 'LIKE', '%'.$keyword.'%')
                        ->orWhere('locations.location_name', 'LIKE', '%'.$keyword.'%')
                        ->orWhere('areas.area_name', 'LIKE', '%'.$keyword.'%')
                        ->orWhere('elements.updated_at', 'LIKE', '%'.$keyword.'%');
                })
                ->select('element_designs.id as element_design_id', 'element_designs.doc_no', 'elements.id as element_id', 'element_designs.element_name', 'locations.location_name', 'areas.area_name',
                    'elements.updated_at')
                ->paginate()
                ->map(function ($row) use ($keyword) {
                    $row->element_name = preg_replace('/' . $keyword . '/', '<strong>'.$keyword.'</strong>', $row->element_name)
                        ->location_name = preg_replace('/' . $keyword . '/', '<strong>'.$keyword.'</strong>', $row->location_name);
                    return $row;
                });

            return view('element.data', ['items' => $items]);

当我输入关键字“ abc”时,我希望使用关键字对abc文本数学的结果要强。例如:“元素1 abc” =>“元素1 abc ”,“位置1 abc” =>“位置1 abc ” 因此,在index.blade.php中,对于与关键字匹配的文本,结果将显示为强。

2 个答案:

答案 0 :(得分:0)

据我所知map()创建一个新集合,而不使用当前集合,要使用当前集合,请使用transform()check doc here

答案 1 :(得分:0)

尝试

$row->element_name = preg_replace('/' . $keyword . '/', '<strong>$keyword</strong>', $row->element_name)
                        ->location_name = preg_replace('/' . $keyword . '/', '<strong>$keyword</strong>', $row->location_name);

这里不需要使用标签和变量进行连接。