描述我的问题的最好方法是解释我的情况:
我正在使用yii,因此任何响应都应该面向该框架。
我有一个包含许多关系中的产品和类别的数据库,因此产品表,类别表和category_product表用于它们之间的关系。
我也有一个用户表。允许用户购买某些类别的产品,因此category_user表描述了另一个多关系,其中现有关系表示允许用户购买该类别中的任何产品。
我的问题是:如果我目前拥有用户和产品,是否有一种简单的方法来确定用户是否可以购买产品,这意味着用户和产品之间存在相同类别的关系。我很难找到一种有效或简单的方法来实现这一目标,而不仅仅是抓取与用户相关的类别ID的数组以及与产品相关的另一个类别ID数组,然后在这些数据中搜索匹配。
答案 0 :(得分:2)
我认为有两种方法可以做到:
只需使用ORM功能加载参考:
isbelongTo($user, $product){
foreach($user->categories as $category){
foreach($category->products as $pr){
if($pr->id==$product->id)
return true;
}
}
return false;
}
但是我相信我不会这样做,因为它必须加载一堆东西,而不是使用纯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
}
我肯定会选择第二种方法!
答案 1 :(得分:0)
也许正在使用Relational Query with through,您可以拨打exist或类似的内容