Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Laravel-whereHas()关系的最新记录_Laravel_Eloquent_Relationship - Fatal编程技术网

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

Laravel-whereHas()关系的最新记录,laravel,eloquent,relationship,Laravel,Eloquent,Relationship,这是我在这里的第一篇帖子,请原谅我的错误:) 我目前正在从事库存管理应用程序(Laravel)项目。我已经到了我所做的一切都不起作用的地步,所以现在我请求帮助 我有一个产品表,其中一些是与其他的关系。一切都发生在一张桌子上。如果产品有子项,子项将覆盖父项 然后,我对它们运行的所有查询都使用以下逻辑: 如果项目没有任何子项,请使用它 如果项目有子项,请使用最新的子项(最高id) 现在,我在模型文件中创建了关系: public function childItems(){ return

这是我在这里的第一篇帖子,请原谅我的错误:)

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

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

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

  • 如果项目没有任何子项,请使用它
  • 如果项目有子项,请使用最新的子项(最高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;
}