1

私の質問を説明する最良の方法は、私の状況を説明することです。

私はyiiを使用しているので、すべての応答はそのフレームワークに向けられる必要があります。

多くの関係にある製品とカテゴリのデータベースがあるので、それらの間の関係については、製品テーブル、カテゴリテーブル、およびcategory_productテーブルがあります。

ユーザーテーブルもあります。ユーザーは特定のカテゴリの製品を購入できます。そのため、category_userテーブルで記述される別の多くの関係があります。既存の関係は、ユーザーがそのカテゴリのすべての製品を購入できることを示します。

私の質問はこれです:私が現在ユーザーと製品を持っている場合、ユーザーが製品を購入できるかどうかを判断する簡単な方法はありますか?つまり、ユーザーと製品は同じカテゴリに関係しています。ユーザーに関連するカテゴリIDの配列と、製品に関連するカテゴリIDの別の配列を取得して、それらの中で一致するものを検索する以外に、これを実現するための効率的または簡単な方法を見つけるのに非常に苦労しています。 。

4

2 に答える 2

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 }

私は間違いなく2番目のアプローチを選びます!

于 2012-10-09T16:36:30.760 に答える
0

たぶん、スルーでリレーショナルクエリを使用し、 existまたは類似のものを呼び出すことができます

于 2012-10-09T16:37:58.163 に答える