我正在使用Yii框架构建一个Web应用程序,我对它很新。 我有3个数据库表。一个存储用户,第二个产品,第三个是存储user_id,product_id和更多信息的关系表,如产品购买时间。
我配置了MANY_MANY关系,并且没有问题可以获得用户购买的所有产品。但是我无法弄清楚如何从关系表中获取额外信息?
谢谢
答案 0 :(得分:3)
如果您的关联包含其他数据,您可以将自己声明为类Purchase
并添加以下关系:
class User extends CActiveRecord
{
public function relations()
{
return array(
'purchases' => array(self::HAS_MANY, 'Purchase', 'user_id'),
// Products purchased by this user
'products' => array(
self::HAS_MANY, 'Product', 'product_id',
'through' => 'purchases',
),
);
}
}
class Purchase extends CActiveRecord
{
// You need to add this, since every purchase is uniquely identified
// by user and product. Surrogate 'id' key is also fine
public function primaryKey()
{
return array('user_id', 'product_id');
}
public function relations()
{
return array(
'user' => array(self::BELONGS_TO, 'User', 'user_id'),
'product' => array(self::BELONGS_TO, 'Product', 'product_id'),
);
}
}
从MANY_MANY
和User
模型中删除剩余的Product
个关系。请注意through关系的用法。获取数据可能如下所示:
$users = User::model()->with('purchases.product')->findAll();
foreach ($users as $user) {
echo $user->username . "<br>";
echo 'Purchases<br>';
foreach ($user->purchases as $purchase) {
echo "Date: {$purchase->purchased_at}<br>";
echo "Product: {$purchase->product->name} <br>";
}
echo '<hr>';
}
这将只从User
表执行另一个表上的一个查询。此外,User::model()->with('products')
将有效地找到他们购买的产品的用户。您的数据库方案可以保持不变,除非您需要在关联表中添加复合主键。
有关详细说明,请参阅this article in the Yii wiki。