所以我在两个表之间存在多对多的关系,这是"项目"和" Tier"我有一个中间表" Item_Tier"其中有两个Fks充当Pks,这将使密钥成为复合密钥。
现在我正在尝试为中间表创建一个简单的CRUD,我知道Yii有一个限制,它无法为具有复合键的表创建CRUD。我喜欢扩展Giix,它宣称它支持复合键的CRUD。
现在我已经按照它安装过程,我可以看到它被添加到我的Gii中,因为我可以看到Giix crud和模型生成器。我用Giix和gii创建模型以确保它没有效果,它仍然给我一个错误,它因为Composite id而无法创建CRUD。
我该如何解决这个问题?
答案 0 :(得分:1)
我认为你可能不需要很多连接表的CRUD操作。
您有两个表的Item和Tier CActiveRecords。
您可以在其中指定关系:
// Item
public function relations(){
return array(
...
'tiers'=>array(self::MANY_MANY,'Tier', 'Item_Tier(item_id, tier_id)'),
...
);
}
// Tier
public function relations(){
return array(
...
'items'=>array(self::MANY_MANY,'Item', 'Item_Tier(tier_id, item_id)'),
...
);
}
现在,您可以阅读层的项目和项目的层。 然后你可以在Tier类中创建一个addItem($ item)函数(或类item中的addTier($ tier),类似于此)
添加连接:
// Tier class
public function addItem(Item $item){
// check if item is saved. You may check if the current tier object is saved, similarly if($this->isNewRecord){...}
if($item->isNewRecord){
// item object is not saved into the db yet, cannot assign
// you can try to save it here, or throw an exception, or just return false and handle where you call this method
return false;
}
$exists = Yii::app()->db->createCommand
->from('Item_Tier')
->where('item_id=:iid AND tier_id=:tid',array(':iid'=>$item->id,':tid'=>$this->id))
->queryRow();
if($exists !== FALSE){
// this item is already added to this tier
return true;
}
$affectedRows = Yii::app()->db->createCommand->insert('Item_Tier',array('item_id'=>$item->id,'tier_id'=>$this->id));
return $affectedRows > 0;
}
现在,您还可以将项目分配给层,将层分配给项目(如果在Item类中实现类似的方法)
删除连接:
// Tier class
public function deleteItem(Item $item){
// check if item is saved. You may check if the current tier object is saved, similarly if($this->isNewRecord){...}
if($item->isNewRecord){
// item object is not saved into the db yet, cannot assign
// you can try to save it here, or throw an exception, or just return false and handle where you call this method
return false;
}
$affectedRows = Yii::app()->db->createCommand->delete('Item_Tier','item_id=:iid AND tier_id=:tid',array(':iid'=>$item->id,':tid'=>$this->id));
return $affectedRows > 0;
}
更新等同于删除连接和添加新连接。 这样,您就不必为具有crud操作的连接表创建新的AR类。
希望这有帮助!