#DUVIDA - Problemas com Laravel utilizando o foreach para mostrar comentários na view.
Bom dia! Estava desenvolvendo uma etapa do meu projeto em que é necessário realizar certas ações..
Usuário digitar o comentário e o enviar -> resgatar o comentário do usuário e seu nome -> enviar para uma tabela mysql -> puxar essas informações para a view.
Porém, estou enfrentando um erro bem estranho... Tentando printar apenas um comentario para teste tudo funcionou corretamente, mas adicionando o foreach, o código quebra e não estou entendendo o motivo.
Erro: Attempt to read property "user_name" on bool
Irei deixar os códigos relacionados e espero que consigam entender o motivo do erro e me ajudar! Agradeço desde já pela atenção.
OBS: Analisando agora, não faz muito sentido relacionar os dois bancos de dados (comments e users), já que estou puxando apenas o nome do usuário logado e jogando para a tabela comments, não sendo necessário tal relação. Apenas algo que descobri enquanto criava a postagem.
Model Comment:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Comment extends Model
{
use HasFactory;
public function user(){
return $this->belongsTo(User::class);
}
}
Model User:
<?php
namespace App\Models;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Fortify\TwoFactorAuthenticatable;
use Laravel\Jetstream\HasProfilePhoto;
use Laravel\Sanctum\HasApiTokens;
use Illuminate\Database\Eloquent\Model;
class User extends Authenticatable
{
use HasApiTokens;
use HasFactory;
use HasProfilePhoto;
use Notifiable;
use TwoFactorAuthenticatable;
/**
* The attributes that are mass assignable.
*
* @var array<int, string>
*/
protected $fillable = [
'name',
'email',
'password',
];
/**
* The attributes that should be hidden for serialization.
*
* @var array<int, string>
*/
protected $hidden = [
'password',
'remember_token',
'two_factor_recovery_codes',
'two_factor_secret',
];
/**
* The attributes that should be cast.
*
* @var array<string, string>
*/
protected $casts = [
'email_verified_at' => 'datetime',
];
/**
* The accessors to append to the model's array form.
*
* @var array<int, string>
*/
protected $appends = [
'profile_photo_url',
];
public function projects(){
return $this->hasMany(Project::class);
}
public function comments(){
return $this->hasMany(Comment::class);
}
}
Migration:
public function up()
{
Schema::create('comments', function (Blueprint $table) {
$table->id();
$table->integer('project_id');
$table->text('user_name');
$table->text('commentary');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('comments');
}
Controller da view:
public function show($id){
$project = Project::findOrFail($id);
$comments = Comment::findOrFail($id);
return view('show', ['project' => $project, 'comments' => $comments]);
}
View (irei deixar apenas as partes relevantes):
<section class="comment-section">
<div class="commentary-send-div">
<form action="/projects/show/{{$project->id}}/comment" method="POST">
@csrf
<input type="text" name="commentary" class="commentary-input" id="commentary-input" placeholder="Digite seu comentario aqui">
<input type="submit" class="submit" id="submit" name="submit" value="Submit">
</form>
<div class="commentary-div">
@foreach($comments as $comment)
<div>
<p class="comment-title"> {{ $comment->user_name }} </p>
<p class="comment-body"> {{ $comment->commentary }} </p>
</div>
<hr>
@endforeach
</div>
</div>
</section>
A um tempo atrás respondi uma questão parecida no Stackoverflow, vê se ela te ajuda. https://stackoverflow.com/questions/36594637/laravel-relation-model-how-to-get-authors-name-in-comment-model-through-post-mo/68697379#68697379