关于预加载条件约束的问题

如代码所示, 想实现的效果是通过订单信息反查出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));
    }
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 7

with查询条件,关联属性内select需要包含所查询的字段,不然不生效

Laravel

1周前 评论

file 这里建议不做 if 判断,直接

 $query->orwhere('receive_mobile', $wd);
 $query->orwhere('order_number', $wd);
 $query->orwhere('customer_name', $wd);
1周前 评论
auithira (楼主) 1周前
Order模型:
public function warehouse()
{
    return $this->hasOne(Warehouse::class, 'id',"oid");
}


$wd = $request->get("state");
        $state = $request->get("wd");
        $order = new Order();
        $eid = $this->eid;
        if ($wd) {
            if (is_numeric($wd)) {
                if (strlen($wd) == 11) {
                    $field = 'receive_mobile';
                } else {
                    $field = 'order_number';
                }
            } else {
                $field = 'customer_name';
            }
            $order =  $order->where($field, $wd);
        }
        $order->whereHas("warehouse",function($query)use($eid,$state){

            if($state){
                if (in_array($state, Warehouse::state())) {
                    // 指定状态
                    $query->where('state', $state);
                } else {
                    // 仓库所有状态
                    $query->whereIn('state', Warehouse::state());
                }
            }
            return $query->where("eid",$eid);
        })->select([
            "*",DB::raw("(select warehouse.state from warehouse where warehouse.id = order.oid) as state")
        ])
            ->orderBy("state","desc")
            ->orderBy("id","asc")
            ->paginate($request->get('pageSize'), [], 'page', $request->get('current'));
1周前 评论
auithira (楼主) 1周前

如果是只看laravel文档,whereHas是你需要的,但是你需要根据左右表的大小来决定使用whereHas(where exists)还是whereIn里面放子查询

1周前 评论
auithira (楼主) 1周前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!