Laravel 4:尝试从同一页面获取变量

时间:2013-11-28 07:23:08

标签: php ajax laravel

我是Laravel的新手,我发现了一个错误,我认为这个错误与逻辑有关,而不是其他任何东西,但我似乎无法理解如何克服它。 所以,我有一个页面,用一个简单的表单来搜索我的数据库中的特定字符串。但我希望结果显示在同一页面上。

这是我到目前为止所拥有的:

这是我的Route.php:

Route::get('/', 'HomeController@index');
Route::post('find', 'HomeController@find');

这是我的HomeController:

public function index()
{
    return View::make('index');
}

public function search()
{
    return View::make('index');
}

public function find()
{
    $match = Input::get('find');
    if($match) {
        $results = Book::where('title', 'like', '%'.$match.'%')
                        ->orWhere('author', 'like', '%'.$match.'%')
                        ->get(); 
        return View::make('index', array('results', $results));
    } else {
        return Redirect::to('/')->with('flash_error', 'No string added!');
    }
}

我的观点(index.blade.php):

    {{ Form::open(array('url' => 'find', 'method' => 'POST')) }}
    {{ Form::text('find', '', array('class' => 'search-query', 'placeholder' => 'Search')) }}
    {{ Form::submit('Submit', array('class' => 'btn btn-info')) }}
    {{ Form::close() }}
    @if (Session::has('flash_error'))
            {{ Session::get('flash_error') }}
    @endif
@foreach ($results as $result)
        {{$result->title}}
@endforeach

(最终foreach将被一些ajax加载替换以显示每个结果)

错误显示“未定义变量:结果”并显示foreach。 我明白为什么这个错误出现了,因为在第一次传递到这个页面时结果还没有被加载但是我怎么能克服这个?我真的希望数据显示在同一页面上,而不必转到另一个页面来显示它们。 就像我说的那样,我认为这主要与逻辑有关(虽然我对Laravel很新,所以也可能就是这样)

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

你需要传递一个关联数组作为make方法的第二个参数

return View::make('index', array('results' => $results);

答案 1 :(得分:0)

这里的问题是,在多个控制器中使用index.blade.php时,您忘记了哪些控制器提供了哪些变量(因此可以省略哪些变量)。

当您请求/HomeController@index)时,会呈现index.blade.php,但由于没有$results传递给视图,您会看到未定义变量警告。这不是HomeController@find中的问题,因为您定义了$results。要解决这个问题,您需要在isset()之前对$results进行foreach检查。像这样:

@if(isset($results))
    @foreach ($results as $result)
        {{$result->title}}
    @endforeach
@endif

您的逻辑可能会因页面布局而异(您可能需要添加其他内容并显示其他占位符内容)。


此外,如果将View::make() $results的调用抽象为index_gen()并未将代码保留为DRY,那么我建议将其替换为find()致电View::make()