多态关系中的where子句

时间:2020-07-17 15:54:34

标签: laravel eloquent eloquent-relationship

我有桌子

threads
- id
replies
- id
- repliable_id
- repliable_type

我想在 Thread 中添加另一列,这是最新回复的ID。

Thread::where('id',1)->withRecentReply()->get()

以及以下查询范围

public function scopeWithRecentReply() {
    return $query->addSelect([
            'recent_reply_id' => Reply::select('id')
                ->whereHasMorph('repliable', ['App\Thread'], function ($q) {
                    $q->where('repliable_id', '=', 'threads.id');
                })->latest('created_at')
                ->take(1),
        ]);
}

我也尝试过

public function scopeWithRecentReply() {
    return $query->addSelect([
            'recent_reply_id' => Reply::select('id')
                ->where('repliable_id', '=', 'threads.id')
                ->latest('created_at')
                ->take(1),
        ]);
}

但是在两种情况下

recent_reply_id => null

如果我输入整数而不是 threads.id ,它会起作用并且 recent_reply_id 不为空 例如

public function scopeWithRecentReply() {
    return $query->addSelect([
            'recent_reply_id' => Reply::select('id')
                ->whereHasMorph('repliable', ['App\Thread'], function ($q) {
                    $q->where('repliable_id', '=', 1);
                })->latest('created_at')
                ->take(1),
        ]);
}

我的问题是

是否可以使用相应的 threads.id 来获取 recent_reply_id

1 个答案:

答案 0 :(得分:0)

我建议您使用appends而不是query scopes,因此在您的Thread模型中,我们将添加

protected $appends = ['recent_reply_id'];

.....

public function replies () {
    // you need to add here your relation with replies table
}

public function getRecentReplyIdAttribute () {
    return $this->replies()->latest('id')->first()->id;
}

现在无论您在哪里查询threads表,您都可以像这样访问recent_reply_id

$thread = Thread::where('id',1)->withRecentReply()->get();

$thread->recent_reply_id;