如何从 hasMany 但有条件创建 hasOne 关系?

问题描述 投票:0回答:1

我正在尝试从 HasMany 关系中创建 HasOne 关系,但添加了条件。

这些是我的模型

文档.php

class Document extends Model
{
    public function approvals(): HasMany
    {
        return $this->hasMany(Approval::class);
    }

    public function nextApproval(): HasOne
    {
        return $this->hasOne(Approval::class)->where('status', 'pending')->orderBy('created_at', 'asc');
    }
}

批准.php

class Approval extends Model
{     
    public function documents(): BelongsTo
    {
        return $this->belongsTo(Document::class);
    }
}

审批样本数据

id 文档_id 位置_id 状态
1 1 1 待定
2 1 2 待定

现在在文档索引页面中,我只想在登录用户的位置处于下一个批准中时显示文档。

$documents = Document::query()
    ->whereHas('nextApproval', fn ($q) => $q->where('position_id', auth()->user()->position_id))
    ->paginate();

根据审批数据,职位 ID 为 2 的用户不应看到任何文档,因为下一个待审批是 ID 为 1、职位 ID 为 1 的审批。 现在,如果第一个用户批准了文档,批准的状态将更改为“完成”,下一个批准应该是职位 ID 为 2 的用户。所以这有点像基于给定条件的动态 HasOne 关系。

我尝试了这些代码:

$this->approvals()->orderBy('created_at', 'asc')->where('status', 'pending')->one();
$this->hasOne(Approval::class)->where('status', 'pending')->oldest('created_at')->limit(1);

查询:

$documents = Document::query()
    ->whereExists(function ($query) {
        $query->from('approvals')
            ->whereColumn('approvals.document_id', 'documents.id')
            ->where('status', 'pending')
            ->where('position_id', auth()->user()->position_id)
            ->orderBy('created_at', 'asc');
        });
->paginate();

这些似乎都不起作用。

latestOfMany
oldestOfMany
也不起作用,因为它总是获取最新的或最旧的并且忽略给定的条件。 如果不可能,是否有关于如何实现这一目标的建议?

laravel eloquent relationship
1个回答
-1
投票
$position = Auth::user()->position_id;


$documents = Document::whereHas('approvals', function ($query) use ( $position) {
    $query->where('position_id',$position)
          ->where('status', 'pending')
          ->orderBy('created_at', 'asc'); 
})->get();
© www.soinside.com 2019 - 2024. All rights reserved.