Executando verificação de segurança...
1

#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>
Carregando publicação patrocinada...
1
2

Cara, pelo que entendi você está tentando realizar um foreach em um objeto. O método findOrFail retorna pra você um objeto, talvez por isso tentando resgatar apenas um comentário deu tudo certo.

Tente usar algo como: Comment::where('project_id', $id)->get(), dessa forma ele trará um array de comentários onde você poderá realizar suas iterações.

Talvez esse possa ser o problema. Se não, manda o link do repo pra dar uma olhada.

1

Funcionou!!! Obrigado demais cara. Não fazia ideia dessa do findOrFail apenas puxar um objeto.. Então nesse ('project_id', $id)->get() tá sendo realizada uma comparação entre project_id e o $id? Só para confirmar que estou interpretando corretamente.

2

O método Where você coloca uma condicional na sua query, nesse caso os registros devem ter o project_id igual ao valor da variável $id.

where('project_id', '=', $id)

O método find() ele busca de acordo com seu index informado na migration, no caso quando você faz Comment::find($id) você está buscando um registro onde o seu id seja igual ao valor da variável $id.

Em resumo é isso.

1

Opa, acabei esquecendo, ta aqui:

    public function comment(Request $request, $id){
        $comment = new Comment;

        $user = auth()->user();

        $comment->project_id = $id;
        $comment->user_name = $user->name;
        $comment->commentary = $request->commentary;

        $comment->save();

        return redirect('/');
    }
3

na view que puxa os comments, precisa acertar o where da consulta pra puxar comentarios where('project_id', '=', '$id')->get() do projeto.

salvo engano o findOrFail() tb puxa só o primeiro pelo id.

1
1