2012-10-09 31 views
1

來形容我的問題,最好的方法是解釋我的情況:Yii的多多對多查詢

我使用警予,所以任何反應應該朝着這一框架取向。

我有一個數據庫與產品和類別在許多關係,所以產品表,類別表和category_product表之間的關係。

我也有一個用戶表。用戶可以購買某些類別的產品,因此category_user表中描述了另一種多種關係,其中現有的關係表示允許用戶購買該類別中的任何產品。

我的問題是這樣的:如果我目前有用戶和產品,是否有一種簡單的方法來確定用戶是否可以購買產品,這意味着用戶和產品之間存在相同類別的關係。我很難找到一種高效或簡單的方法來實現這一點,而不僅僅是獲取與用戶相關的類別標識的數組以及與該產品相關的另一個類別標識的數組,然後在這些數據中搜索匹配。

回答

2

我看到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 }

我肯定會選擇第二個方法!

+0

第二屆一個正是我一直在尋找是什麼東西。 (減少一個錯字或兩個)謝謝噸! – shulmey