Gabotronix
1 week ago

Paginate polymorphic relationship, topic->comments()

Posted 1 week ago by Gabotronix

Hi everybody, I'm building a basic forum, there are many topics and each topic has comments, a comment or "commentable" can be a a comment or a reply (commented a comment), this is because I want to have nested comments, that's where parent_id is useful. I'm wondering if my polymorphic relationship is the best way to achieve this so I'm open to any suggestions. The first issue I came up with is I don't know hw to do ajax pagination of topic->comments ..., I thought with something like Comment::whereHas('topic') ... but my comments dont' have a topic relationship defined in the model.

I'm using laravel advanced ajax pagination, how can I paginate comments?

Topic model:

class Topic extends Model
{
    
    
    protected $table = 'topics';
    
    public function author()
    {
        return $this->belongsTo('App\Models\User', 'user_id');
    }

    public function comments()
    {
        return $this->morphMany('App\Models\Comment', 'commentable')->whereNull('parent_id');
    }

public function up()
    {
        Schema::create('topics', function (Blueprint $table) {
            $table->increments('id');
            $table->unsignedInteger('user_id')->index();
            $table->foreign('user_id')->references('id')->on('users');
            $table->string('title');
            $table->text('body');
            $table->string('url')->unique();
            $table->string('slug')->unique();
            $table->boolean('isVisible')->default(false);
            $table->timestamps();
        });
    }


}

Comment model:

class Comment extends Model
{
    
    
    protected $table = 'comments';

    public function author()
    {
        return $this->belongsTo('App\Models\User', 'user_id');
    }

    public function replies()
    {
        return $this->hasMany('App\Models\Comment', 'parent_id');
    }


}


public function up()
    {
    Schema::create('comments', function (Blueprint $table) {
       $table->bigIncrements('id');
       $table->integer('user_id')->unsigned();
       $table->integer('parent_id')->unsigned();
       $table->integer('commentable_id')->unsigned();
       $table->string('commentable_type');
       $table->text('body');
       $table->timestamps();
    });
    }

This is where I took inspiration:

Please sign in or create an account to participate in this conversation.