如何使用Laravel根据此表中字段的计数获取产品

时间:2019-06-08 21:24:52

标签: php laravel laravel-5.8

我正在研究Laravel 5.8

假设我们有一个这样的餐桌产品:

id | product_type_id | ...

1 | ______ 1 _______ | ...

2 | ______ 2 _______ | ...

3 | ______ 2 _______ | ...

4 | ______ 3 _______ | ...

我想知道如何获取所有与产品类型“共享”的产品。

换句话说,我想获取除product_type_id在表中唯一的那些产品之外的所有产品。

我知道谁在foreach循环中执行此操作,但是我想利用使用Laravel的资源。

谢谢。

2 个答案:

答案 0 :(得分:0)

Laravel的实现方式是将雄辩的关系与has()whereHas()一起使用,就像这样:

$products = Product::whereHas('type', function ($builder) {
    $builder->whereKey(Type::has('products', '>=', 2)->pluck('id'));
})->get();

我假设您已经定义了ProductType模型并将它们连接在一起:

  • Product属于Type
  • Type hasMany Product

答案 1 :(得分:0)

如果我正确理解了您的问题,则可以执行以下操作。

首先,请确保您的ProductType模型已定义产品关系。 (我假设它基于您的“产品”表。)

然后,您可以使用雄辩的模型方法has根据关系计数进行查询。

示例:

ProductType::with('products')->has('products', '>', 1)->get();

with('products')是可选的。它只是简单地同时抓取产品,以避免其他查询。 whereHas方法也可以使用,但实际上仅在需要基于更复杂的参数过滤关系时才需要。

您还可以在has模型内部使用whereHas / Product方法,使用反(即belongsTo)关系来获得相同的东西,但取反。这实际上取决于您希望如何将数据呈现给您。

示例:

Product::whereIn(
    'product_type_id',
    ProductType::has('products', '>', 1)->pluck('id')
)->get();

首先总结一下,将为您提供:

ProductType => Product

第二个示例将给您:

Product => ProductType

有关更多信息,请参见相关的Laravel documentation

希望有帮助!