Laravel 5.1 - 显示特定页面的评论

时间:2015-10-20 15:42:51

标签: php laravel-5

编辑3:原因可能是因为两个控制器都指向同一页?

编辑2:我得到的答案后仍然没有工作。

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

  

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

这可能是因为两个变量都导致同一页面?项目变量在评论系统之前完美运行。

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

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

项目变量声明。

我正在尝试从我的数据库中获取我的评论,以便在我正在进行的laravel 5项目中的特定“项目页面”上显示。想法是用户可以添加艺术项目,其他用户可以对它们进行评论,但每当我尝试访问该页面时,我都会得到

  

未定义的变量:评论(查看:   /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;
}

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

提前致谢

3 个答案:

答案 0 :(得分:1)

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

use App\Comment;

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

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

其次,您需要更改路径以显示POST请求中的注释到GET请求。目前您正在制作相同的路线,而且GET是检索数据的正确请求类型。

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

第三,您在视图中引用了$ project变量,但从未将其从控制器中传入。这需要引用一些东西。

答案 1 :(得分:0)

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

评论模型:

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

答案 2 :(得分:0)

我需要清空commentsController中的节目,只用它来保存评论。为了展示它们,我在我的projectsController中创建了一个额外的函数。它最终成了这个;

 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]);
}