【问题标题】:Laravel 5.1 - Showing Comments on Specific PageLaravel 5.1 - 在特定页面上显示评论
【发布时间】:2015-10-24 20:57:26
【问题描述】:

Edit3:可能是因为两个控制器都指向同一个页面吗?

Edit2:得到答案后仍然无法正常工作。

编辑:错误一已解决,现在我得到:

未定义变量:项目(查看: /var/www/resources/views/pages/showProject.blade.php)

这可能是因为两个变量都指向同一个页面吗?项目变量在评论系统之前运行良好。

public function index()
{
    $projects = Project::all();

    return view('pages.projects', compact('projects'));
}

项目变量声明。

我正在尝试从我的数据库中获取我的 cmets,以显示在我正在处理的 laravel 5 项目中的特定“项目页面”上。这个想法是用户可以添加艺术项目,其他用户可以对其发表评论,但每当我尝试访问该页面时,我都会得到 ​​p>

未定义变量:cmets(查看: /var/www/resources/views/pages/showProject.blade.php)

这是我的控制器

public function index()
{
  $comments = Comment::all();

  return view('pages.showProject', compact('comments'));
}

public function store()
  {
    $input = Request::all();
    $comment = new Comment;
    $comment->body = $input['body'];
    $comment->project_id = $input['project_id'];
    $comment->user_id = Auth::user()->id;
    $comment->save();
    return redirect('projects/'.$input['project_id']);

}

这些是我的路线

// add comment
Route::post('projects/{id}','CommentController@store');

// show comments
Route::post('projects/{id}','CommentController@index');

我的看法

 @if (Auth::check())

    <article> <!--Add comment -->

        <br/>
        {!! Form::open() !!}
        {!! form::text('body', null, ['class' => 'form-control']) !!}

        <br/>

        {!! Form::Submit('Post Comment', ['class' => 'btn btn-primary form-control']) !!}
        {!! Form::hidden('project_id', $project->id) !!}


        {!! Form::close() !!}
        <br/>

    </article>

    <article>

        @foreach ($comments as $comment)

            <article>

                <p>Body: {{ $comment->body }}</p>
                <p>Author: {{ $comment->user->name }}</p>

            </article>


        @endforeach

    </article>
    @else
    <p>Please log in to comment</p>
   @endif

模型

class Comment extends Model
{
    //comments table in database
    protected $guarded = [];

    // user who has commented
    public function author()
    {
        return $this->belongsTo('App\User','user_id');
    }

    // returns post of any comment
    public function post()
    {
        return $this->belongsTo('App\Project','project_id');
    }

    public function comments()
    {
        return $this->hasMany('App\Comment');
    }

    public $timestamps = false;
}

有什么办法可以解决这个问题吗?

提前致谢

【问题讨论】:

  • 试试return view('pages.showProject', array('comments'=&gt;$comments));
  • '表达式结果未使用'和'无法到达的语句'在返回视图的 $cmets 部分。我会用我的模型更新 OP。
  • 另外Route::post('projects/{id}','CommentController@index');应该是Route::get('projects/','CommentController@index');//id没有被使用,你使用的是GET而不是POST
  • 好吧,那是我的错。我替换了它,现在错误显示“未定义变量:项目(视图:/var/www/resources/views/pages/showProject.blade.php)”。这可能是因为 cmets 和 projects 变量都指向同一个页面吗?
  • 将项目变量作为关联数组添加到视图中,如 cmets (array('project'=&gt;Project::where('id', '=', $id)-&gt;firstOrFail())) 并在控制器中从请求中获取 $id(function index($id),使用 url 中的 id 更改路由(Route::get('projects/{id}','CommentController@index');)

标签: php laravel-5


【解决方案1】:

首先,您需要确保在控制器中为“评论”模型设置别名。这是通过use 语句完成的。

use App\Comment;

class CommentController extends Controller
{
    public function index()
    {
      $comments = Comment::all();

      return view('pages.showProject', compact('comments'));
    }
}

其次,您需要将显示 cmets 的路由从 POST 请求更改为 GET 请求。目前,您正在制作相同的路由,而且 GET 是检索数据的正确请求类型。

Route::get('projects/{id}','CommentController@index');

第三,您在视图中引用了一个 $project 变量,但从未从控制器传入它。那需要参考一些东西。

【讨论】:

  • 这两件事都已得到纠正。在 OP 底部对结果进行了编辑。
  • 啊,好吧,确保你也为你的视图定义了 $project 变量。没有意识到它在 cmets 中得到了回答。
  • 项目变量定义为在我添加 cmets 之前它正在工作。我也更喜欢在答案部分回答的问题。
【解决方案2】:

我认为你们的关系是错误的。试试这个:

评论模型:

class Comment extends Model
{
    public function user()
    {
        return $this->belongsTo('App\User');
    }
}

用户模型:

class User extends Model
{
    public function comments()
    {
        return $this->hasMany('App\Comment');
    }
}

在视图中你可以使用:

@foreach($comments as $comment)
    <p>{{ $comment->user->name }}</p>
@endforeach

【讨论】:

  • 已更正。同样的问题在 OP 上有编辑。感谢您的修复!
  • 为什么不用$comment->id 而不是$project->id?
  • 每个项目页面都有一个链接到项目的特定 ID + 每个项目的 cmets 必须是唯一的。
【解决方案3】:

我需要清空 cmetsController 中的显示,仅用于保存 cmets。为了展示它们,我在我的项目控制器中做了一个额外的功能。结果就是这样;

 public function show($id)
    {
    $project = Project::findOrFail($id)->load("User");

    $input = Request::all();

    //-----------------------DB-----------------------------//
    $project_comments = DB::table('comments')
        ->select('body', 'name')
        ->where('project_id', '=', $id)
        ->join('users', 'users.id', '=', 'user_id')
        ->get();
    //-----------------------DB-----------------------------//

    return view('pages.showProject', ['project' => Project::findOrFail($id), 'comments' => $project_comments]);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-30
    • 1970-01-01
    • 1970-01-01
    • 2020-07-28
    • 2018-04-10
    • 2011-09-06
    • 2016-02-24
    • 2014-10-30
    相关资源
    最近更新 更多