第一天我正在看YII,我在尝试解决某些表之间的关系方面遇到了一些问题。
我的表格结构如下:
宠物: pet_id pet_name ....
Pet_Owner_Link pet_id owner_id
拥有者: owner_id OWNER_NAME
我如何获得属于所有者的所有宠物?现在真的很难理解AR关系。
答案 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;