我正在尝试从 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
也不起作用,因为它总是获取最新的或最旧的并且忽略给定的条件。
如果不可能,是否有关于如何实现这一目标的建议?
$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();