php - 如何在 Laravel 6.x 中的 Eloquent 查询中添加模型相关条件?

标签 php laravel eloquent laravel-6 laravel-query-builder

在我的 Laravel 6.x 项目中,我有 Product 模型、ProductCategoryWarehouseProduct 模型。

Product中,我存储产品的基本信息。在 ProductCategory 模型中,我存储产品的类别信息。在 WarehouseProduct 中,我存储仓库中产品的库存量信息。当然我有很多仓库,有很多产品。

我的产品如下所示:

class Product extends Model
{
    protected $fillable = [
        'name',
        'item_number',
        // ...
    ];

    public function categories() {
        return $this->belongsToMany(ProductCategory::class, 'product_category_products',
            'product_id', 'product_category_id');
    }
}

产品类别如下所示:

class ProductCategory extends Model
{
    protected $fillable = [
        'name',
        'description',
        // ...
    ];


    public function products() {
        return $this->belongsToMany(Product::class, 'product_category_products',
            'product_category_id', 'product_id');
    }
}

WarehouseProduct 看起来像这样:

class WarehouseProduct extends Model
{
    protected $fillable = [
        'product_id',
        'warehouse_id',
        'amount',
        // ...
    ];

    public function product() {
        return $this->belongsTo(Product::class, 'product_id');
    }
}

我现在有这个查询:

$query = WarehouseProduct::select([
    'product_id',
    'warehouse_id',
    DB::raw('SUM(free_amount)'),
    DB::raw('SUM(booked_amount)'),
    // ...
]);

if (isset($request->warehouse_id)) {
    $query->where([['warehouse_id', '=', $request->warehouse_id]]);
}

if (isset($request->product_category_id)) {
    // ???
}

如何向查询内容添加 where 条件:此类别的产品

最佳答案

您可以查询Relationship Existence 。由于它是通过另一个模型 (Product) 建立的关系,如果您定义了 Has Many Through,则可以减少查询。关系,但我认为这对于这个特定的查询来说就足够了。

$warehouse_id = $request->warehouse_id;
$product_category_id = $request->product_category_id;

$query = WarehouseProduct::select([
    'product_id',
    'warehouse_id',
    DB::raw('SUM(free_amount)'),
    DB::raw('SUM(booked_amount)'),
    // ...
])
->when($warehouse_id, function ($query) use ($warehouse_id) {
    $query->where('warehouse_id', $warehouse_id);
})
->when($product_category_id, function ($query) use ($product_category_id) {
    $query->whereHas('product', function ($que) use ($product_category_id) {
        $que->whereHas('categories', function ($q) use ($product_category_id) {
            $q->where('id', $product_category_id);
        })
    })
});

$results = $query->get();

请注意,我对 conditional clauses 使用 when 方法,但您可以像以前一样继续使用 if

关于php - 如何在 Laravel 6.x 中的 Eloquent 查询中添加模型相关条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62065992/

相关文章:

php - 将 Node.js(用于实时通知)添加到现有 PHP 应用程序

php - MySQL 特定列的查询错误

laravel - 如何在 laravel 中进行多重过滤查询?

javascript - HTML - 如何制作 "Read More"按钮

PHP函数str_replace应该放在MVC的什么地方?

php - 单独模块中的 Laravel 5 Assets 和 lang 文件夹

laravel - 通过递归获取树

php - 将多个参数传递给 Blade 指令

php - 如何解决 "SQLSTATE[42S22]: Column not found"?

laravel - 更改用于保存时间戳的列名称