雄辩的关系:如何按最新帖子排序主题?

时间:2018-07-23 17:45:23

标签: php laravel laravel-5 eloquent

我创建了一个这样的表(表名称: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);

2 个答案:

答案 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);