Laravel:比较两个系列的最佳方式:whereIn?

时间:2018-03-30 15:09:15

标签: php laravel eloquent

我有一个包含类别的表,一个包含产品的表和另一个用于跟踪用户拥有的产品的表products_user。

在页面上显示产品时,如果用户拥有该产品,则应将“买入”按钮更改为“买入”。

我通过$ categories->产品展示产品。找出用户已拥有哪些产品的最有效方法是什么?

我不想将用户拥有的产品的整个集合加载到内存中,因为这些可能是几千个。我也不想为每个检查创建一个Mysql查询。

where子句有一个选项。但即便如此,我仍然有一种更聪明的方法来创建这个子句,而不需要遍历每个产品来构建数组。

有人可以帮我提出一个好的逻辑吗?谢谢

1 个答案:

答案 0 :(得分:1)

您可以使用Constraining Eager Loads向您的商品添加更多信息。在这种情况下,user_id为NULLuser_id,表示用户是否购买了产品。

$categories = Category::with(['products' => function ($q) {
    $q->select(['products.*', 'user_id'])
        ->leftJoin('products_user', 'user_products.product_id', '=', 'products.id')
        ->where(function ($q) {
            $q->whereNull('user_id')->orWhere('user_id', Auth::user()->id);
        });
}])->get();

foreach ($categories as $category) {
    $products = $category->products;
    foreach ($products as $product) {
        if (empty($product->user_id)) {
            // user not yet bought the product
        }
        else {
            // user already bought the product
        }
     }
}