我第一天在看 YII,我在尝试找出一些表之间的关系时遇到了一些问题。
我的表结构如下:
宠物:pet_id pet_name ....
Pet_Owner_Link pet_id owner_id
所有者:owner_id owner_name
我将如何获得属于所有者的所有宠物?目前,我真的很难理解 AR 的关系。
我第一天在看 YII,我在尝试找出一些表之间的关系时遇到了一些问题。
我的表结构如下:
宠物:pet_id pet_name ....
Pet_Owner_Link pet_id owner_id
所有者:owner_id owner_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)'),
);
}
}
您的问题可能是默认情况下 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;
}
我知道这不完全是您所要求的,但我就是这样做的。
在 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;