Laravel-whereHas()关系的最新记录
这是我在这里的第一篇帖子,请原谅我的错误:) 我目前正在从事库存管理应用程序(Laravel)项目。我已经到了我所做的一切都不起作用的地步,所以现在我请求帮助 我有一个产品表,其中一些是与其他的关系。一切都发生在一张桌子上。如果产品有子项,子项将覆盖父项 然后,我对它们运行的所有查询都使用以下逻辑:Laravel-whereHas()关系的最新记录,laravel,eloquent,relationship,Laravel,Eloquent,Relationship,这是我在这里的第一篇帖子,请原谅我的错误:) 我目前正在从事库存管理应用程序(Laravel)项目。我已经到了我所做的一切都不起作用的地步,所以现在我请求帮助 我有一个产品表,其中一些是与其他的关系。一切都发生在一张桌子上。如果产品有子项,子项将覆盖父项 然后,我对它们运行的所有查询都使用以下逻辑: 如果项目没有任何子项,请使用它 如果项目有子项,请使用最新的子项(最高id) 现在,我在模型文件中创建了关系: public function childItems(){ return
- 如果项目没有任何子项,请使用它
- 如果项目有子项,请使用最新的子项(最高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)记录——为此,我必须将orderBy和limit添加到hasOne()
但是当我想在作用域中使用这个关系时,在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()),当我在where hads中使用它时,它会忽略我应用的过滤函数
从我的描述中我知道这有点复杂,但为了更好地解释它,我将使用一个例子。在tinker中执行以下操作
\App\OrderItem::due()->get();
应该只返回记录id 2,因为数字7有子项,其中当然id 5到期,但最新的子项是id 6未到期
我希望我已经解释够了,让你帮我,因为我已经快疯了。
如果你有什么想法,我可以通过改变现有的一个或改变它的整个逻辑来实现我所需要的,请帮助
谢谢,
Darek我认为问题出在您的
latestChild()
方法中,您在该方法中执行限制(1)
。为什么不试试last()
方法呢
因此:
编辑:
像这样返回值怎么样:
public function latestChild(){
$item = App\OrderItem::all()->last();
return $item;
}
试试这个:
->带有(
[
'latestChild'=>函数(有一个$query){
返回$query->latest('id')->limit(1);
}
]
);
谢谢您的回复!遗憾的是,无法在生成器上使用last()。我想,它只能在阵列上使用。这个呢^这个函数不返回关系,而是返回整个表中的最后一个OrderItem(与特定对象无关)。我明白了,您可以附加整个DB关系模型吗?另外,我不知道has()
method has==sign,因为SQL没有。您好!我有同样的问题,不能过滤一个模型,只有最后一个相关的。。。你能解决这个问题吗?Thx@Zalo有一种稍微不同的方法,它使用父模型上的子选择列来选择最新子项的id,然后可以使用该id连接相应的子项。我以前确实回答过一个非常类似的问题。
public function latestChild(){
$item = App\OrderItem::all()->last();
return $item;
}