Reputation: 501
I am trying to build a commenting system where users are able to leave comments behind on users projects posts.
I can save the and display the projects and on a specific project page(/projects/{id}) I have a form where users can leave comments behind. I am able to save the comments in the database but when I try to show the comments I get this error Undefined variable: comments (View: /var/www/resources/views/projects/show.blade.php).
My files: Comment Model:
class Comment extends Model
{
//comments table in database
protected $guarded = [];
public function user()
{
return $this->belongsTo('App\User');
}
// returns post of any comment
public function post()
{
return $this->belongsTo('App\Project','project_id');
}
public $timestamps = false;
}
Project Model:
class Project extends Model
{
protected $fillable = [
'user_id',
'title',
'tags',
'summary',
'file_name',
'published_at'
];
public function User()
{
return $this->belongsTo('App\User');
}
}
My User model
class User extends Model implements AuthenticatableContract,
AuthorizableContract,
CanResetPasswordContract
{
use Authenticatable, Authorizable, CanResetPassword;
/**
* The database table used by the model.
*
* @var string
*/
protected $table = 'users';
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = ['name', 'email', 'password'];
/**
* The attributes excluded from the model's JSON form.
*
* @var array
*/
protected $hidden = ['password', 'remember_token'];
public function Projects()
{
return $this->hasMany('App\Project');
}
public function comments()
{
return $this->hasMany('App\Comment');
}
}
My CommentController
public function index()
{
$comments = Comment::all();
return view('projects.show', compact('comments'));
}
public function store()
{
$input = Request::all();
$comment = new Comment;
$comment->body = $input['body'];
$comment->on_projects = $input['project_id'];
$comment->from_user = Auth::user()->id;
$comment->save();
return redirect('projects/'.$input['project_id']);
}
My view
@section('content')
<a href="/projects">Terug naar alle projecten</a>
<h1>Werkje: {{ $project->title }}</h1>
<h3>Gemaakt door: <a href='/student/{{ $project->User->id }}'>{{ $project->User->name }}</a></h3>
<img src="{{URL::to('/')}}/uploads/projects/{{ $project->file_name }}">
<h5>Tags: {{$project->tags}}</h5>
<hr />
<h1>Reageer</h1>
@if (Auth::check())
<article> <!--Add comment -->
<br/>
{!! Form::open() !!}
{!! form::text('body', null, ['class' => 'form-control']) !!}
<br/>
{!! Form::Submit('Reageer', ['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>{{ $comment->user->name }}</p>
</article>
@endforeach
</article>
@else
<p>Gelieve in te loggen om te kunnen reageren.</p>
@endif
My routes:
// Student routes REST methode
Route::resource('student', 'StudentController');
Route::get('student/profile', 'StudentController@getProfile');
// add comment
Route::post('projects/{id}','CommentController@store');
// show comments
Route::get('projects/{id}','CommentController@index');
//Project routes REST methode
Route::post('projects/store', 'ProjectsController@store');
Route::resource('projects', 'ProjectsController');
// Authentication routes
Route::get('auth/login', 'Auth\AuthController@getLogin');
Route::post('auth/login', 'Auth\AuthController@postLogin');
Route::get('auth/logout', 'Auth\AuthController@getLogout');
// Registration routes
Route::get('auth/register', 'Auth\AuthController@getRegister');
Route::post('auth/register', 'Auth\AuthController@postRegister');
// Password reset link request routes
Route::get('password/email', 'Auth\PasswordController@getEmail');
Route::post('password/email', 'Auth\PasswordController@postEmail');
// Password reset routes
Route::get('password/reset/{token}', 'Auth\PasswordController@getReset');
I get this error now : Undefined variable: project (View: /var/www/resources/views/projects/show.blade.php)
Upvotes: 4
Views: 2205
Reputation: 501
The index() function in my CommentController is now empty.
I query the comments in my ProjectsController in my show{id} function
public function show($id)
{
$input = Request::all();
$project = Project::all()->load("User");
$project_comments = DB::table('comments')
->select('body', 'name')
->where('on_projects', '=', $id)
->join('users', 'users.id', '=', 'comments.from_user')
->get();
return view('projects.show', ['project' => Project::findOrFail($id), 'comments' => $project_comments]);
}
And this is how I solved the conflicts in my routes
// add comment
Route::post('projects/{id}','CommentController@store');
// add project
Route::post('projects/store', 'ProjectsController@store');
//Project routes REST methode
Route::resource('projects', 'ProjectsController');
Upvotes: 1
Reputation: 336
Ok, as per our chat, you had conflicts in your routes file as you were using a Resource for the projects and a Route for the projects in the same time. We sorted out the best way to load your comments for specific projects and everything works now, hope that helped :)
Upvotes: 0