我正在使用Laravel和MySQL,我有一个表 post 表示用户可以对其发表评论的帖子,现在我想根据每个帖子的评论数来订购帖子升序/降序,我怎么在Laravel这样做?我不想在 post 表中添加字段以跟踪每篇帖子的评论数量,因为每次评论或评论的评论时都会手动更新该字段被添加/删除让我发疯...
这是我创建帖子表和评论表的方式:
Schema::create('posts', function($table) {
$table->increments('id');
$table->string('title', 100)->unique();
$table->string('content', 2000);
$table->timestamps();
});
Schema::create('comments', function($table) {
$table->increments('id');
$table->string('content', 2000);
$table->unsignedInteger('post_id');
$table->foreign('post_id')->references('id')->on('posts')->onDelete('cascade')->onUpdate('cascade');
$table->unsignedInteger('parent_id')->nullable();
$table->foreign('parent_id')->references('id')->on('comments')->onDelete('cascade')->onUpdate('cascade');
$table->timestamps();
});
这就是我在Post模型中设置帖子和评论之间关系的方式:
public function comments() {
return $this->hasMany('Comment', 'post_id');
}
在评论模型中:
public function post() {
return $this->belongsTo('Post', 'post_id');
}
答案 0 :(得分:4)
您可以在显示时执行此操作,但现在您可以从数据库中获取所有条目。如果你有100个帖子,每个帖子有100个评论,你将从你的数据库获得10000行只是为了对你的帖子进行排序(我假设你不想在排序时显示这些评论)。
您可以添加到您的帖子模型:
public function commentsCountRelation()
{
return $this->hasOne('Comment')->selectRaw('post_id, count(*) as count')
->groupBy('post_id');
}
public function getCommentsCountAttribute()
{
return $this->commentsCountRelation ?
$this->commentsCountRelation->count : 0;
}
现在你可以使用:
$posts = Post::with('commentsCount')->get()->sortBy(function($post) {
return $post->comments_count;
});
升序或
$posts = Post::with('commentsCount')->get()->sortBy(function($post) {
return $post->comments_count;
}, SORT_REGULAR, true);
按降序排序。
顺便使用sortBy
和后来reverse
不是一个好主意,你应该在我展示时使用参数sortBy
答案 1 :(得分:1)
我想我已经想出了一个解决方法:
$posts = Post::with('comments')->get()->sortBy(function($post) {
return $post->comments->count();
});
这一个顺序按评论数量递增,如果你想按顺序排序,请执行以下操作:
$posts = Post::with('comments')->get()->sortBy(function($post) {
return $post->comments->count();
})->reverse();