使用Yii从关系表中获取更多数据


Get more data from a relationship table using Yii

我正在使用Yii框架构建一个web应用程序,我对它还很陌生。我有3个数据库表。一个存储用户,第二个存储产品,第三个是关系表,存储user_id、product_id和更多信息,如购买产品的时间。

我配置了MANY_MANY关系,可以毫无问题地获得用户购买的所有产品。然而,我不知道如何从关系表中获得额外的信息?

感谢

如果您的关联包含额外的数据,您可以将自己声明为类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'),
    );
  }
}

UserProduct模型中删除剩余的MANY_MANY关系。注意贯穿关系的用法。获取数据可能如下所示:

$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')将有效地找到用户购买的产品。您的DB方案可以保持不变,只是需要在关联表中添加复合主键。

有关详细解释,请参阅Yii wiki中的这篇文章。