我正在使用Drupal 7和Commerce模块。
我试图警告用户,只要他们将已经拥有的产品添加到购物车中。获取用户已拥有的产品列表(在PHP代码中)似乎是一个挑战,因为行项目和产品之间的连接是序列化的blob。
作为参数,我有购物车中当前产品和用户的列表。
如果我采用EntityFieldQuery的方式,我可以轻松获取与给定产品相关的所有订单项,但我无法扩展查询以仅过滤给定用户的已完成订单。 (或者我可以吗?那会很棒。)
如果我采用db_select的方式,我可以轻松获得给定用户的所有已完成订单,但我无法桥接订单项< - >产品连接。
任何帮助将不胜感激。
答案 0 :(得分:3)
嗯,这是其他人感兴趣的答案:
显然有一个名为“field_data_commerce_product”的表格,其中包含行项目ID的“entity_id”列和产品ID的“commerce_product_product_id”列。此表允许db_select轻松连接订单,行项目和产品,以实现我询问的那种查询。
这是完整的查询:
<?php
// Assuming we have $user populated with the user's ID:
$query = db_select('commerce_order', 'cord');
$query->join('commerce_line_item', 'li', 'cord.order_id = li.order_id');
$query->join('field_data_commerce_product', 'prod', 'li.line_item_id = prod.entity_id');
$query->condition('cord.uid', $user, '=')
->condition('cord.status', 'completed', '=')
->fields('prod', array('commerce_product_product_id'));
$result = $query->execute();
?>
这将返回给定用户已拥有的所有产品ID。