gpt4 book ai didi

Laravel - whereHas() 中关系的最新记录

转载 作者:行者123 更新时间:2023-12-02 14:09:28 25 4
gpt4 key购买 nike

这是我在这里发表的第一篇文章,所以请原谅任何错误:)

我目前正在从事库存管理应用程序(Laravel)的项目。我已经到了我所做的一切都不起作用的地步,所以现在我请求帮助。

我有一个包含产品的表,其中一些产品与其他产品有关系。一切都发生在一张 table 上。如果产品有子产品,则子产品将覆盖父产品。

products table view

然后,我对它们运行的​​所有查询都使用以下逻辑:

  • 如果该项目没有任何子项,请使用它。
  • 如果该项目有子项,请使用最新的子项(最高 ID)

现在我在模型文件中创建了关系:

public function childItems(){
return $this->hasMany('\App\OrderItem','parent_id');
}

public function parentItem(){
return $this->belongsTo('\App\OrderItem','parent_id');
}

public function latestChild(){
return $this->hasOne('\App\OrderItem','parent_id')->orderBy('id','desc')->limit(1);
}

latestChild() 关系的问题是,当您运行此查询时:

\App\OrderItem::find(7)->latestChild()->get()

它工作正常,并且仅返回关系中的一条(最新)(id 6)记录 - 为此,我必须向 hasOne() 添加 orderBy 和 limit。

但是当我想在作用域中使用这种关系时,因此在 whereHas 方法中,它无法正常工作,因为它采用任何子级而不是最新的子级。

public function scopeDue($query){
return $query->where(function($q){
$q->has('childItems','==',0)->has('parentItem','==',0)->whereDate('due_date','=', Carbon::today()->toDateString())->whereNull('return_date');
})->orWhere(function($q2){
$q2->has('childItems')->has('parentItem','==',0)->whereHas('childItems',function($q3) use($q2){
$q3->whereDate('due_date','=', Carbon::today()->toDateString())->whereNull('return_date');
});
})->with('latestChild');

}

但是,最后的 with() 返回正确的记录。

我认为,它之所以如此有效,是因为我的关系latestChild()返回所有子级(尽管有hasOne()),并且当我在whereHas中使用它时,它会忽略我应用的过滤函数。

我知道我所描述的有点复杂,但为了更好地解释它,我将使用一个例子。在tinker中执行以下操作

\App\OrderItem::due()->get();

应该只返回记录 id 2,因为数字 7 有子项,当然 id 5 是到期的,但最新的子项是 id 6,它没有到期。

我希望我已经解释得足够多了,可以让你帮助我,因为我已经为此疯狂了。如果您对我如何通过更改现有的或更改其整个逻辑来实现我的需要有任何想法,请帮助!

谢谢,达雷克

最佳答案

试试这个:

->with(
[
'latestChild' => function (HasOne $query) {
return $query->latest('id')->limit(1);
}
]
);

关于Laravel - whereHas() 中关系的最新记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36499396/

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