YII 活动记录加入


YII Active Record Join

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

我的表结构如下:

宠物:pet_idpet_name....

Pet_Owner_Linkpet_idowner_id

所有者:owner_idowner_name

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

根据 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)'),
    );
  }
}

您的问题可能是默认情况下,宠物和主人的主键应该是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;
}
我知道

这不是你所要求的,但这就是我的做法。

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

'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;