微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Laravel Spatie Query Builder - 加入时查询错误

如何解决Laravel Spatie Query Builder - 加入时查询错误

我对 spatie/Laravel-query-builder 包有问题。我使用这个包来简单地过滤和排序我的查询,但它不是那样的 :D

我试图过滤具有两种关系的结果 - 商店和员工。简而言之,它要过滤商店报告列表

看,这是我的代码。当我使用 join 方法时,作为响应接收到 ID 不正确的数据。当评论加入方法时一切正常,但我需要按关系排序。

return ReportControlResource::collection(
            QueryBuilder::for(Report::class)
                ->with(['employee','shop'])
                ->allowedFilters('shop.name','employee.name')
                ->join('employees','employees.id','=','reports.employee_id')
                ->join('shops','shops.id','reports.shop_id')
                ->allowedSorts(['employees.name'])
                ->get()
        );

我在报表模型中的关系:

public function shop(): BelongsTo
    {
        return $this->belongsTo(Shop::class);
    }

    public function employee(): BelongsTo
    {
        return $this->belongsTo(Employee::class);
    }

Shop 模型中的关系:

public function reports()
    {
        return $this->hasMany(Report::class);
    }

在员工模型中

public function reports()
    {
        return $this->hasMany(Report::class);
    }

你有什么想法吗?

我注意到 ID 被覆盖了,但不是 shop_id 和 employee_id,但是 ID 为什么??

我认为问题在于图书馆本身。创作者没有像我的情况那样考虑加入表格的相反情况。

看看文档中的例子:

$addRelationConstraint = false;

QueryBuilder::for(User::class)
    ->join('posts','posts.user_id','users.id')
    ->allowedFilters(AllowedFilter::exact('posts.title',null,$addRelationConstraint));

还有我的加入

->join('employees','reports.employee_id')

但是这个连接是这样工作的

->join('employees','reports.id','reports.employee_id')

但是为什么呢?我查了好多种顺序,连过滤都断开了,也没啥变化

解决方法

我找到了问题的解决方案。我必须选择一列,现在一切正常:-)

return EvidenceControlResource::collection(
            QueryBuilder::for(EvidenceControl::class)
                ->allowedIncludes('employee','shop')
                ->select('evidence_controls.*',DB::raw('employees.id as employee_id'))
                ->join('employees','evidence_controls.employee_id','=','employees.id')
                ->select('evidence_controls.*',DB::raw('shops.id as shop_id'))
                ->join('shops','evidence_controls.shop_id','shops.id')
                ->allowedFilters('shop.name','employee.name')
                ->allowedSorts(['employees.name','shops.name'])
                ->get()
        );

这不是干净的代码,但是当使用实现 Sort 创建自己的类时,代码可能看起来好多了。

感谢盖伊的帮助!祝你好运! :-)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。