1

我第一天在看 YII,我在尝试找出一些表之间的关系时遇到了一些问题。

我的表结构如下:

宠物:pet_id pet_name ....

Pet_Owner_Link pet_id owner_id

所有者:owner_id owner_name

我将如何获得属于所有者的所有宠物?目前,我真的很难理解 AR 的关系。

4

2 回答 2

1

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

“如果您声明多对多关系,则可连接声明中的键顺序必须是 '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;
}
于 2012-04-13T19:37:05.467 回答
-1

我知道这不完全是您所要求的,但我就是这样做的。

在 Owner 模型中的关系()返回中添加此项:

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

在 Pet_Owner_Link 模型中的关系()返回中添加此项:

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

然后养一个这样的宠物

$owner->all_pets[$i]->pet;
于 2012-04-13T15:55:34.123 回答