【问题标题】:Laravel Eloquent Model return data if relatioship has data如果关系有数据,Laravel Eloquent 模型返回数据
【发布时间】:2020-11-30 01:48:57
【问题描述】:

美好的一天,我正在尝试从 Eloquent 模型中返回具有关系的数据。 有没有办法(跳过/不返回)关系返回空数组作为结果的订单?

 Order::with(['products' => function ($query) {
        $query->whereHas('progress', function ($query) {
            $query->where('progress_id', 30)->orWhereBetween('progress_id', [60, 90]);
        });
        $query->whereHas('product', function ($query) {
            $query->where('vendor_id', 3);
        })->with(['product' => function ($query) {
            $query->select('id', 'identifier', 'reference', 'shipping_id');
        }]);
        $query->select('id', 'order_id', 'product_id', 'quantity');
    }])
        ->whereHas('products')
        ->where('status_id', '=', 15)
        ->select('orders.id', 'orders.customer_id', 'orders.created_at')
        ->get();

所以在这种情况下,我不想收到该订单,因为它没有产品。 另外我不明白为什么我什至会得到结果,有些订单的 status_id = 15 但不是 vendor_id = 3。 怎么做?感谢您的阅读。

【问题讨论】:

    标签: php mysql laravel eloquent laravel-query-builder


    【解决方案1】:

    试试这个:

    Order::whereHas('products' => function ($query) {
            $query->whereHas('progress', function ($query) {
                $query->where('progress_id', 30)->orWhereBetween('progress_id', [60, 90]);
            });
            $query->whereHas('product', function ($query) {
                $query->where('vendor_id', 3);
            });
            // $query->select('id', 'order_id', 'product_id', 'quantity'); // This line will cause error
        }])->with(['products', 'products.product:id,identifier,reference,shipping_id,vendor_id'])
           ->where('status_id', 15)
           ->get();
    

    【讨论】:

    • 您好 maki10 感谢您的回复。我已经尝试过你的 sn-p 它可以在没有现有供应商的情况下工作!我确实有这样的错误,即查询返回两种产品,即使其中一种产品的进度不是 30 或 60-90 之间。如果两种产品都没有取得适当的进展,它将不会退回订单,这很好。看起来 where progress_id 部分没有正确地将逻辑应用于单个产品。怎么做?感谢您阅读。
    • 对不起,我没听懂你的意思。让我们尝试简单并告诉我我错在哪里。以上query 将执行以下操作: 1. 给我所有 Orders 其中有 ProductsStatus_id 为 15 2. 过滤 Products progress,如果有一个,其中progress_id 是 30 orWhere 介于两者之间.. 3. 按product 过滤 Products,如果有一个,其中 vendor_id 是 3 4。急切加载product 通过选择id,identifier,reference,shipping_id 也试试这个})->with(['product:id,identifier,reference,shipping_id,vendor_id']);
    • 没关系,绝对是挑战。查询不加载 products.product 这部分:->with(['product:id,identifier,reference,shipping_id,vendor_id']);即使有些没有正确的progress_id,它也会返回所有产品的订单。
    • 如果你删除所有的 Eager 负载? with(['products'])->with(['product:id,identifier,reference,shipping_id,vendor_id'])
    • 在这种情况下,它只会返回我的订单。
    【解决方案2】:

    让我们试试这段代码:

    Order::has('product', '>=', 1)->get();
    

    【讨论】:

    • 您好 R.tbr 感谢您的回复。当我只运行那部分时,我确实收到了两个包含产品的订单。 Order::has('products', '>=', 1)->get();
    • 嗨。你是什么意思?也许你只有两个符合这种条件的订单('product', '>=', 1)
    • 好吧,如果我调用 Order::has('products', '>=', 1)->get();它会退回给我有 1 个或多个已订购产品的订单。订单有很多产品是关系
    • Order::has('product', '>=', 1)->with('products')->get();
    • 我没有完全理解你的意思。但也许上面的代码有用
    【解决方案3】:

    试试这个

    Order::whereHas('products')->with(['products' => function ($query) {
            $query->whereHas('progress', function ($query) {
                $query->where('progress_id', 30)->orWhereBetween('progress_id', [60, 90]);
            });
            $query->whereHas('product', function ($query) {
                $query->where('vendor_id', 3);
            })->with(['product' => function ($query) {
                $query->select('id', 'identifier', 'reference', 'shipping_id');
            }]);
            $query->select('id', 'order_id', 'product_id', 'quantity');
        }])->where('status_id', '=', 15)
            ->select('orders.id', 'orders.customer_id', 'orders.created_at')
            ->get();
    

    【讨论】:

    • 哈马德汗您好,谢谢您的回复,但我仍然得到相同的结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-26
    • 2013-02-26
    • 1970-01-01
    相关资源
    最近更新 更多