YII积极记录加入

时间:2012-04-13 14:24:10

标签: php activerecord yii many-to-many

第一天我正在看YII,我在尝试解决某些表之间的关系方面遇到了一些问题。

我的表格结构如下:

宠物: pet_id pet_name ....

Pet_Owner_Link pet_id owner_id

拥有者: owner_id OWNER_NAME

我如何获得属于所有者的所有宠物?现在真的很难理解AR关系。

2 个答案:

答案 0 :(得分:1)

DD.Jarod在Yii AR文档页面上的评论:http://www.yiiframework.com/doc/guide/1.1/en/database.arr#c970

“如果你声明了多对多的关系,那么jointable声明中的键的顺序必须是'my_id,other_id':

class Post extends CActiveRecord
{
  public function relations()
  {
    return array(
        'categories'=>array(self::MANY_MANY, 'Category',
            'tbl_post_category(post_id, category_id)'),
    );
  }
}
class Category extends CActiveRecord
{
  public function relations()
  {
    return array(
        'Posts'=>array(self::MANY_MANY, 'Post',
            'tbl_post_category(category_id, post_id)'),
    );
  }
}

所以你的代码看起来像是:

class Owner extends CActiveRecord
{
  public function relations()
  {
    return array(
        'pets'=>array(self::MANY_MANY, 'Pet',
            'tbl_post_category(pet_id, owner_id)'),
    );
  }
}
class Pet extends CActiveRecord
{
  public function relations()
  {
    return array(
        'owners'=>array(self::MANY_MANY, 'Post',
            'tbl_post_category(owner_id, pet_id)'),
    );
  }
}

您的问题可能是默认情况下Pet和Owner的主键应该是id(而不是pet_id / owner_id)。如果您没有说明您的主键与默认命名约定不匹配/未在数据库中设置为主键,则Yii可能会感到困惑。您可以在模型中指定主键的内容,如下所示:

public function primaryKey()
{
    return 'owner_id';
}

最后,你会检索这样的信息:

$owner = Owner::model()->findByPk((int)$id);
foreach($owner->pets as $pet)
{
    print $pet->name;
}

答案 1 :(得分:-1)

我知道这不是你要求的,但我就是这样做的。

在您的relations()中添加此项以返回所有者模型:

'all_pets'=>array(self::HAS_MANY, 'Pet_Owner_Link','owner_id'),

在pet_Owner_Link模型中的relations()中添加此项:

'pet'=>array(self::BELONGS_TO, 'Pet', 'pet_id'),

然后得到这样的宠物

$owner->all_pets[$i]->pet;