关于预加载条件约束的问题
如代码所示, 想实现的效果是通过订单信息反查出warehouse的数据, 应当如何通过模型实现, 还请各位赐教
Warehouse模型:
public function order(): Relations\BelongsTo
{
return $this->belongsTo(Order::class, 'oid')
->select('id', 'order_number', 'shipping_type', 'memo', 'state');
}
查询方法:
public function record(Request $request): Response
{
$state = $request->get('state');
$wd = $request->get('wd');
$order = Warehouse::with(['orderItem', 'order' => function ($query) use ($wd) {
if ($wd) {
if (is_numeric($wd)) {
if (strlen($wd) == 11) {
$field = 'receive_mobile';
} else {
$field = 'order_number';
}
} else {
$field = 'customer_name';
}
$query->where($field, $wd);
}
return $query;
}])->when($state, function ($query, $state) {
if (in_array($state, Warehouse::state())) {
// 指定状态
return $query->where('state', $state);
} else {
// 仓库所有状态
return $query->whereIn('state', Warehouse::state())->orderByRaw('state desc,id');
}
})->where('eid', $this->eid)
->select('id', 'oid', 'state', 'created_at', 'stock_in_at', 'stock_out_at')
->paginate($request->get('pageSize'), [], 'page', $request->get('current'));
return $this->success(apiResource($order));
}
with查询条件,关联属性内select需要包含所查询的字段,不然不生效
如果是只看laravel文档,whereHas是你需要的,但是你需要根据左右表的大小来决定使用whereHas(where exists)还是whereIn里面放子查询