【问题标题】:Undefined variable: posts when passing parameter from controller to view未定义变量:将参数从控制器传递到视图时发布
【发布时间】:2019-08-30 00:52:51
【问题描述】:

我正在尝试在 Laravel 中创建一个搜索功能,并在我对视图执行 foreach 时返回“未定义变量:帖子”。

我的代码:

后模型

class Post extends Model { 

    protected $fillable = [ 
        'creator', 
        'post_url', 
        'books', 
        'likes', 
        'created_at' 
        ]; 

    public function user() { return $this->belongsTo(User::class); } 

}

主视图:

<form action="{{ url('/search') }}" method="get">
   <input type="text" class="search-text form-control form-control-lg" name="q" placeholder="Search" required>
 </form>

控制器:

public function search($keyword)
    {
        $result = Post::where('books', 'LIKE', "'%' . $keyword . '%'")->get();
        return view('/search', ['posts' => $result]);
    }

路线:

Route::get('/search/{keyword}', 'SearchController@search');

搜索视图:

@foreach($posts as $post)
  <div class="post">{{ $post->id }}</div>
@endforeach

我在这里做错了什么?

【问题讨论】:

  • 尝试返回视图('search')->with('posts', $results);
  • 问题很可能是控制器没有获取到关键字
  • 是的,这不起作用。我应该如何将关键字传递给控制器​​? @DerekPollard
  • @Jascusi 从参数中删除$keyword,并在方法中使用它:$keyword = request()-&gt;input('q');
  • 这更有意义,但我遇到了同样的错误。

标签: laravel


【解决方案1】:

它不工作的原因,

Route::get('/search/{keyword}', 'SearchController@search');

在您的路由文件中,您正在寻找表单从未传递过的{keyword}。您的表单操作是action="{{ url('/search') }}"。 get 变量不会被路由拾取,如果它被你称为输入 'q' 无论如何。

那么在您的控制器中,您正在寻找从未传入的正在传递的关键字。

public function search($keyword)

正确的做法是像这样传递 Request 对象

public function search(Request $request)

然后使用$request-&gt;input('q') 通过您的表单检索传递的值。

在您的示例中,$keyword 始终为空白。

更正的代码

主页:

<form action="{{ url('/search') }}" method="get">
   <input type="text" class="search-text form-control form-control-lg" name="q" placeholder="Search" required>
 </form>

控制器:

public function search(Request $request)
{
    $result = Post::where('books', 'LIKE', "%{$request->input('q')}%")->get();
    return view('/search', ['posts' => $result]);
}

路线:

Route::get('/search', 'SearchController@search');

搜索视图:

@foreach($posts as $post)
  <div class="post">{{ $post->id }}</div>
@endforeach

【讨论】:

  • 感谢您指出这一点。那是正确的答案,在我完成这些步骤之后它就起作用了! :)
【解决方案2】:

这可能会对你有所帮助。

Homeview.blade.php

<form action="/search" method="POST">
    @csrf // include your csrf token 

    <input type="text" class="search-text form-control form-control-lg" id="q" name="q" placeholder="Search" required>
</form>

Searchview.blade.php

<!-- or did you return a collection? --> 
@if( $posts->count() > 1 )

    <!-- then loop through the posts --> 
    @foreach( $posts as $post )
        <div class="post"> {{ $post->id }} </div>
    @endforeach

@else

    @if( !empty($posts) )
        <div class="post"> {{ $post->id }} </div>
    @endif 

@endif 

Routes/web.php

Route::post('/search', 'PostsController@show')->name('posts.show');

PostsController

use App\Post;

public function show( Request $request )
{

    $result = Post::where("books", "LIKE", "%{$request->input('q')}%")->get();

    // Uncomment the following line to see if you are returning any data
    // dd($result);

    // Did you return any results?
    return view('searchview', ['posts' => $result]);

}

【讨论】:

  • 我不知道该怎么办?因为当我在查询之前输入 dd($result) 时,它给了我同样的错误。
  • 我更新了我的答案并添加了一行用于调试您的帖子路线。你能取消注释并告诉我它返回什么吗?
  • 这似乎也是一个愚蠢的问题,但你能告诉我你的 Post 模型吗?
  • 你可能需要修复这个位 @if( $posts->count() == 1 )
    {{ $post->id }}
    如果它是一个对象,则没有计数功能,如果它是一个集合,您还没有将对象拉出。
  • GET 请求在搜索方面也比 POST 更好,因为可以共享链接。 Janice 可以将链接转发给 Sharon 并获取她正在查看的搜索结果,但她无法通过 POST 做到这一点。 (顺便说一句,不知道 Janice 或 Sharon 是谁)
【解决方案3】:

尝试:

return view('/search')->with('posts', $result);

使用动态变量甚至更好。

return view('/search')->withPosts($result);

【讨论】:

  • 这不起作用,因为问题不在于 OP 将数据传递到视图的方式
  • 很遗憾,这不起作用,我遇到了和以前一样的错误。
  • 在调用视图之前尝试 dd 会得到什么? dd($result);
  • 同样的错误..我觉得它真的很愚蠢而且很容易解决,但我不知道是什么。
  • 您是否导入了 Post 类?使用应用\发布; ?
猜你喜欢
  • 1970-01-01
  • 2017-06-06
  • 1970-01-01
  • 1970-01-01
  • 2022-08-18
  • 1970-01-01
  • 2019-03-16
  • 2012-02-10
相关资源
最近更新 更多