Laravel - 来自其中哈斯()的关系的最新记录

Dar*_*jak 6 relationship laravel eloquent

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

我目前正在研究库存管理应用程序(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);
}
Run Code Online (Sandbox Code Playgroud)

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

\App\OrderItem::find(7)->latestChild()->get()
Run Code Online (Sandbox Code Playgroud)

它工作正常,只返回一个(最新)(id 6)记录关系 - 为此我必须添加orderBy并限制为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');

}
Run Code Online (Sandbox Code Playgroud)

但是,最后用()返回正确的记录.

我认为,它的工作原因是因为我的关系latestChild()返回所有子节点(尽管有hasOne()),当我在where中使用它时它忽略了我应用的过滤函数.

我知道它与我描述的有点复杂,但为了更好地解释它,我会用一个例子.在修补匠中执行以下操作

\App\OrderItem::due()->get();
Run Code Online (Sandbox Code Playgroud)

应该只返回记录ID 2,因为数字7有孩子,当然id 5到期,但最新的孩子是id 6,这是未到期的.

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

谢谢,Darek

Nor*_*gul -1

我认为问题出在latestChild()你执行limit(1). 为什么不试试这个last()方法呢?

所以:

public function latestChild(){
    return $this->hasOne('\App\OrderItem','parent_id')->last();
}
Run Code Online (Sandbox Code Playgroud)

编辑:

像这样返回值怎么样:

public function latestChild(){
    $item = App\OrderItem::all()->last();
    return $item;
}
Run Code Online (Sandbox Code Playgroud)