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

时间:2012-03-23 21:36:14

标签: php yii

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

我配置了MANY_MANY关系,并且没有问题可以获得用户购买的所有产品。但是我无法弄清楚如何从关系表中获取额外信息?

谢谢

1 个答案:

答案 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_MANYUser模型中删除剩余的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