首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Laravel Spatie Query Builder -进行连接时查询错误

Laravel Spatie Query Builder -进行连接时查询错误
EN

Stack Overflow用户
提问于 2021-06-02 03:49:03
回答 1查看 438关注 0票数 0

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

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

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

代码语言:javascript
复制
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()
        );

我在报表模型中的关系:

代码语言:javascript
复制
public function shop(): BelongsTo
    {
        return $this->belongsTo(Shop::class);
    }

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

Shop模型中的关系:

代码语言:javascript
复制
public function reports()
    {
        return $this->hasMany(Report::class);
    }

在员工模型中

代码语言:javascript
复制
public function reports()
    {
        return $this->hasMany(Report::class);
    }

你有什么想法吗?

我注意到ID正在被覆盖,但没有覆盖shop_id和employee_id,但ID为什么??

我认为问题出在库本身。创建者没有考虑到我的例子中连接表的相反情况。

看看Doc中的例子:

代码语言:javascript
复制
$addRelationConstraint = false;

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

和我的加入

代码语言:javascript
复制
->join('employees', 'employees.id', '=', 'reports.employee_id')

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

代码语言:javascript
复制
->join('employees', 'reports.id', '=', 'reports.employee_id')

但是为什么呢?我用很多方法检查了顺序,甚至断开了过滤,但它没有改变任何事情

EN

回答 1

Stack Overflow用户

发布于 2021-06-02 04:15:38

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

代码语言:javascript
复制
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()
        );

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67795184

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档