多态关系中的 where 子句

Posted

技术标签:

【中文标题】多态关系中的 where 子句【英文标题】:Where clause in polymorphic relationship 【发布时间】:2020-11-07 11:20:35 【问题描述】:

我有桌子

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】:

我建议使用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;

【讨论】:

实际上,我需要查询范围内的 id,因为我想继续构建查询,因为我要创建的查询比仅获取 id 复杂一点。

以上是关于多态关系中的 where 子句的主要内容,如果未能解决你的问题,请参考以下文章

Cypher where子句因多条路径而失败

Laravel 查询关系 where 子句

Laravel关系列'id'在where子句中不明确

如何在 laravel 雄辩的关系中使用 where 子句

房间数据库中具有一对多关系的 Where 子句

Laravel 6:如何将多个 where 子句添加到关系中