简体   繁体   中英

Store Comments in DB

I am looking for a solution for storing comments in the database, but it is not difficult at all:

In one table wants to write comments from several modules on the website.

I am currently creating a table using code 'comments table':

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

Comments modules table:

    public function up()
{
    //
    Schema::create('comment_module',function (Blueprint $table){
        $table->increments('id');
        $table->string('title',190);
        $table->string('name',190)->unique();
        $table->text('body');
        $table->timestamps();
    });
}

for now everything is okay, but i have problem with select all comments for each blog post,gallery, etc..

blog, gallery - name of modules.

code for Map.php model

    public function comments(){
    return $this->hasMany(Comment::class,'module_id');
}

CommentModule.php model

 public function comments(){
    return $this->hasMany(Comment::class,'module_id');
}

Comment.php

public function module(){
    return $this->belongsTo(CommentModule::class);
}

and now how to pass a 'mmodule_id' ?

normal use with any relationships for one table will be like that:

$map->comments->body . . etc.

but for that construction don`t work, yes of course i can use raw query and use join, right ?

Is any option to use a Eloquent?

IMHO for what I understood you want to attach comments to more than one Eloquent Model. There is a clean example in the laravel docs with Polymorphic Relations

As summary you have to add two fields on the comments table: commentable_id (integer) and commentable_type (string).

After that you declare the relation on the Comment model:

public function commentable()
{
    return $this->morphTo();
}

And you can use the comments() relation in each model you want to attach comments, ie:

class Post extends Model
{
    public function comments()
    {
        return $this->morphMany('App\Comment', 'commentable');
    }

class Map extends Model
{
    public function comments()
    {
        return $this->morphMany('App\Comment', 'commentable');
    }

Now you can retrieve comments as usual:

$post->comments;

To attach a new comment to a parent:

$post->comments()->create([array of comment attributes]);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM