我创建了一个这样的表(表名称:supports):
$table->increments('id');
$table->integer('user_id')->unsigned()->nullable();
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
$table->integer('parent_id')->unsigned()->nullable();
$table->foreign('parent_id')->references('id')->on('supports')->onDelete('cascade');
$table->text('body');
$table->timestamps();
在支持模型中,我这样做:
public function supports()
{
return $this->hasMany(Support::class , 'parent_id' , 'id');
}
public function latestSupport()
{
return $this->hasOne(Support::class,'parent_id','id')->orderBy('created_at', 'desc')->latest();
}
最后,我尝试在控制器中调用此函数(在模型中):
public function scopeSearch($query, $input)
{
$query->where('parent_id',null);
$query->with('latestSupport');
return $query->latest();
}
它返回根目录(主题)...但是它不能按最新的帖子为每个根目录对根目录进行排序。
你能告诉我错吗?
编辑: 在控制器中:
$supports = Support::Search($input)->paginate(20);
答案 0 :(得分:1)
我认为您正在寻找的是以下内容,其中我们对相关的created_at
进行了排序,而不是根目录。为此,我们需要执行子查询(或执行联接)。
public function scopeSearch($query, $input)
{
$query->with('latestSupport');
$query->whereNull('parent_id');
$query->select('supports.*', \DB::raw(
'(SELECT MAX(s2.created_at) FROM supports as s2 WHERE supports.id = s2.parent_id) as sort'
));
$query->orderBy('sort');
return $query;
}
我还用where('parent_id', null)
取代了whereNull('parent_id')
,以利用本机SQL语法。
答案 1 :(得分:0)
尝试更换
$supports = Support::Search($input)->paginate(20);
使用
$supports = Support::Search($input)->latest()->paginate(20);