Laravel 5搜索JSON文件并显示数据

时间:2018-03-09 09:38:22

标签: php json laravel search collections

我有一个带有typeahead的搜索引擎。我想要的是,在进行搜索并提交提交后,显示结果。这给出了两个问题:第一个是返回一个空数组,第二个是它不允许我访问属性告诉我它不是一个对象。

在控制器中,我使用了collect()来允许我访问属性,但它不起作用,而且也在哪里。

public function store(Request $request)
{
    $url = 'storage/json/es/noticia.json';
    $datos = file_get_contents($url);
    $data = json_decode($datos, true);
    $data = collect($data)->where("title","LIKE","%{$request->texto}%")->all();

    return view('web.buscar.index', compact('data'));
}

如果我使用$data = collect($data)->all();,我可以看到该集合:

array:8 [▼
  0 => []
  1 => array:4 [▼
    "id" => 2
    "title" => "There is a title"
    "lead" => "There is a lead"
    "slug" => "there-is-a-title"
  ]
  2 => array:4 [▶]
  3 => array:4 [▶]
  4 => array:4 [▶]
  5 => array:4 [▶]
  6 => array:4 [▶]
  7 => array:4 [▶]

]

然后,如果我在视图中尝试:$value->title,则会出现错误:尝试获取非对象的属性“标题”。在视图中,我有:

{!! Form::open([
    'route' => 'buscar',
    'id' => 'buscar',
    'name' => 'buscar',
    'class' => 'buscador col-xs-12',
    'method' => 'POST',
    'accept-charset' => 'utf-8'
    ]) !!}

    <input id="texto" name="texto" class="input_buscador typetitulo" autocomplete="off" type="text"/>

    {!! HTML::image('images/web/icons/lupa.svg', '',  array('height' => '30', 'class' => 'boton_buscador', 'onclick' => 'document.buscar.submit()') ) !!}

{!! Form::close() !!}

@if(isset($data))
    @foreach($data as $value)
        <span>{{$value->title}}</span><br>
    @endforeach
@endif

如果我在控制器中使用$data = collect($data)->pluck('title');而在视图中我没有调用属性'title',这可行,但这不是我想要的,因为我也需要访问其他属性。 任何的想法?提前谢谢!

1 个答案:

答案 0 :(得分:1)

这是失败的,因为数组中的第一个数组没有任何值,因此您将获得未定义的索引,通过执行

删除任何空数组
    public function store(Request $request)
{
    $url = 'storage/json/es/noticia.json';
    $datos = file_get_contents($url);
    $data = json_decode($datos, true);

    $data = array_filter($data);

    $data = collect($data)->where("title","LIKE","%{$request->texto}%")->all();
    return view('web.buscar.index', compact('data'));
}

或者你可以测试一下你的foreach是否存在

 @foreach($data as $value)
    <span>{{$value->title ?? ''}}</span><br>
@endforeach

然后,您可以使用过滤器

搜索集合
    collect($data)->filter(function ($item) use ($request) {
        return $item->title == $request->texto;
    )

您可以使用stristr等编辑返回更精细