【问题标题】:Get more data from a relationship table using Yii使用 Yii 从关系表中获取更多数据
【发布时间】:2012-03-24 19:12:48
【问题描述】:

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

我配置了一个 MANY_MANY 关系,并且可以毫无问题地获取用户购买的所有产品。但是我不知道如何从关系表中获取额外信息?

谢谢

【问题讨论】:

    标签: php yii


    【解决方案1】:

    如果您的关联包含额外的数据,您可以将自己声明为一个类 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 关系。注意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()-&gt;with('products') 也将有效地找到用户购买的产品。您的数据库方案可以保持不变,但您需要在关联表中添加复合主键。

    详情请见this article in the Yii wiki

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-03
      • 1970-01-01
      相关资源
      最近更新 更多