我有一个包含类别的表,一个包含产品的表和另一个用于跟踪用户拥有的产品的表products_user。
在页面上显示产品时,如果用户拥有该产品,则应将“买入”按钮更改为“买入”。
我通过$ categories->产品展示产品。找出用户已拥有哪些产品的最有效方法是什么?
我不想将用户拥有的产品的整个集合加载到内存中,因为这些可能是几千个。我也不想为每个检查创建一个Mysql查询。
where子句有一个选项。但即便如此,我仍然有一种更聪明的方法来创建这个子句,而不需要遍历每个产品来构建数组。
有人可以帮我提出一个好的逻辑吗?谢谢
答案 0 :(得分:1)
您可以使用Constraining Eager Loads向您的商品添加更多信息。在这种情况下,user_id为NULL
或user_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
}
}
}