我对软件包spatie/Laravel-query-builder有一个问题。我使用这个包来简单地过滤和排序我的查询,但它不是这样的:D
我试着过滤结果谁有两个关系-商店和员工。简而言之,它想要过滤商店报告的列表
看,这是我的代码。当我使用join方法时,作为响应,接收到ID不正确的数据。当注释join方法时,一切正常,但我需要按关系排序。
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为什么??
我认为问题出在库本身。创建者没有考虑到我的例子中连接表的相反情况。
看看Doc中的例子:
$addRelationConstraint = false;
QueryBuilder::for(User::class)
->join('posts', 'posts.user_id', 'users.id')
->allowedFilters(AllowedFilter::exact('posts.title', null, $addRelationConstraint));和我的加入
->join('employees', 'employees.id', '=', 'reports.employee_id')但是这个连接是这样工作的
->join('employees', 'reports.id', '=', 'reports.employee_id')但是为什么呢?我用很多方法检查了顺序,甚至断开了过滤,但它没有改变任何事情
发布于 2021-06-02 04:15:38
我找到了解决这个问题的办法。我必须选择一个列,现在一切正常:-)
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的帮助!祝你好运!:-)
https://stackoverflow.com/questions/67795184
复制相似问题