我有以下表格结构,允许用户提交评论或回复评论:
Schema::create('comments', function (Blueprint $table) {
$table->increments('id');
$table->integer('user_id')->unsigned()->nullable();
$table->integer('model_id')->unsigned();
$table->integer('parent_comment_id')->unsigned();
$table->text('comment');
$table->timestamps();
$table->foreign('user_id')->references('id')->on('users')->onDelete('set null');
$table->foreign('model_id')->references('id')->on('models')->onDelete('cascade');
$table->foreign('parent_comment_id')->references('id')->on('comments')->onDelete('cascade');
});
我有一个外键parent_comment_id
,它指向comments
表。这是为了表明评论(仍然是评论对象)属于父评论。
如何在模型中为评论表(/App/Comment.php)定义这种关系?
答案 0 :(得分:1)
您可以尝试这样的事情(在App\Comment
模型中):
public function replies()
{
return $this->childComments()->with('replies');
}
public function childComments()
{
return $this->hasMany(Comment::class, 'parent_comment_id', 'id');
}
因此,您可以使用Comment::with('replies')
递归加载所有相关回复。您可能会因为用于关系的两个函数而感到困惑,因为一个回复可能包含它自己的回复,因此您需要一个恢复性关系。因此,replies()
将使用自己的回复加载所有回复。您也可以查看几年前我为Laravel - 4
撰写的this post of mine,但这个想法是一样的。
// Another example could be something like this
$post = Post::with('comments.replies')->find(1); // Get Post with all comments with replies
注意:在这种情况下,Post
模型必须包含comments()
(hasMany)关系方法。
答案 1 :(得分:0)
您可以这样做:
namespace App;
use Illuminate\Database\Eloquent\Model;
class Comment extends Model
{
public function parentComment()
{
return $this->hasOne('App\Comment');
}
}
您可以在this文档页面中查看更多信息。