Yii Multiple Many-Many查询

时间:2012-10-09 16:10:03

标签: php orm yii many-to-many

描述我的问题的最好方法是解释我的情况:

我正在使用yii,因此任何响应都应该面向该框架。

我有一个包含许多关系中的产品和类别的数据库,因此产品表,类别表和category_product表用于它们之间的关系。

我也有一个用户表。允许用户购买某些类别的产品,因此category_user表描述了另一个多关系,其中现有关系表示允许用户购买该类别中的任何产品。

我的问题是:如果我目前拥有用户和产品,是否有一种简单的方法来确定用户是否可以购买产品,这意味着用户和产品之间存在相同类别的关系。我很难找到一种有效或简单的方法来实现这一目标,而不仅仅是抓取与用户相关的类别ID的数组以及与产品相关的另一个类别ID数组,然后在这些数据中搜索匹配。

2 个答案:

答案 0 :(得分:2)

我认为有两种方法可以做到:

  1. 只需使用ORM功能加载参考:

    isbelongTo($user, $product){ foreach($user->categories as $category){ foreach($category->products as $pr){ if($pr->id==$product->id) return true; } } return false; }

  2. 但是我相信我不会这样做,因为它必须加载一堆东西,而不是使用纯sql,它不会使系统“智能”。 ORM也用于加载对象而不是记录,在我们的例子中,我们不关心对象,所以可以使用纯sql:

    isbelongTo($user, $product){ $connection=Yii::app()->db; $sql = 'select * from category_user cu inner join category_product cp on cu.categoryId = cp.categoryId where cp.productId = :productId cu.userId = :userId'; $command=$connection->createCommand($sql); $command->bindParam(':productId',$product->id,PDO::PARAM_STR); $command->bindParam(':usertId',$user->id,PDO::PARAM_STR); $value=$command->queryScalar(); return $value > 0; //if greater then 0 that means it belong to, so returns true }

  3. 我肯定会选择第二种方法!

答案 1 :(得分:0)

也许正在使用Relational Query with through,您可以拨打exist或类似的内容