gpt4 book ai didi

php - Laravel 条件关系

转载 作者:行者123 更新时间:2023-11-28 23:57:52 27 4
gpt4 key购买 nike

情况是这样的:我有 4 个模型。

  • 发票
  • 债权人
  • 债务人
  • 时间表

这些对象是这样相关的:

  • 一张发票有一个债权人、一个债务人,并且可能有一个时间表。
  • 债务人也可能有时间表。
  • 债权人有时间表。

我正在尝试在 Invoice 上编写 timeline() 关系,以考虑这些对象的优先级顺序。如果债务人有时间线,则使用它。否则,如果发票有时间线,则使用它。最后,如果以上两者均未找到,则使用债权人的时间表。

我环顾四周,正在努力寻找解决方案。在我看来,这很简单,但事实证明并非如此。

我采取的方法都无济于事......

将原始选择语句放入关系中,选择将返回所需时间线的 _rowid:

return $this->hasOne('Timeline', '_rowid', 'SELECT ...')

同样的想法,使用 DB::raw():

return $this->hasOne('Timeline', '_rowid', DB::raw('SELECT ...'))

尝试使用选择和连接加载关系查询:

return $this->hasOne('Timeline', '_rowid', 'timeline_rowid')
->select('Timelines_Country.*')
->join(DB::raw('(select if(Debitor.timeline_rowid is not null, Debitor.timeline_rowid, if(Invoice.timeline_rowid is not null, Invoice.timeline_rowid, Creditor.timeline_rowid)) as timeline_rowid from Invoice join Debitor on Invoice.unique_string_cd = Debitor.unique_string_cd join Creditor on Creditor.id = Invoice.creditor_id where Debitor.timeline_rowid is not null and Invoice.timeline_rowid is not null) temp'), function($join){
$join->on('Timelines_Country._rowid', '=', 'temp.timeline_rowid');
})
->whereNotNull('temp.timeline_rowid');

最终的解决方案似乎是最接近的,但它仍然包括“WHERE IN (?,?,?)”的标准关系查询,其中列表是来自 Invoices 集合的 timeline_rowids,这导致某些时间线仍然没有找到了。

在此先感谢您的帮助!

最佳答案

好的。我想我从根本上误解了人际关系的运作方式。因为它们是在模型已经实例化之后加载的,所以关系查询的其中部分的数组是通过访问模型的属性构建的。一旦我发现这一点,它实际上是一个简单的修复。

我写了这个函数,它根据关系返回 timeline_rowid:

public function getDerivedTimelineAttribute()
{
if ($this->debtor && $this->debtor->timeline_rowid)
{
return $this->debtor->timeline_rowid;
}
else if ($this->timeline_rowid)
{
return $this->timeline_rowid;
}
else if ($this->creditor->timeline_rowid)
{
return $this->creditor->timeline_rowid;
}
else
{
Log::Debug("can't find timeline", ['cdi' => $this->unique_string_cdi]);
return 0;
}
}

然后将关系修改为:

public function timeline()
{
return $this->hasOne('Timeline', '_rowid', 'derivedTimeline');
}

我希望这对其他人有帮助。把我逼疯了一段时间!

关于php - Laravel 条件关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31029477/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com