为yii中具有复合的表创建CRUD

时间:2014-12-16 17:21:14

标签: php yii

所以我在两个表之间存在多对多的关系,这是"项目"和" Tier"我有一个中间表" Item_Tier"其中有两个Fks充当Pks,这将使密钥成为复合密钥。

现在我正在尝试为中间表创建一个简单的CRUD,我知道Yii有一个限制,它无法为具有复合键的表创建CRUD。我喜欢扩展Giix,它宣称它支持复合键的CRUD。

现在我已经按照它安装过程,我可以看到它被添加到我的Gii中,因为我可以看到Giix crud和模型生成器。我用Giix和gii创建模型以确保它没有效果,它仍然给我一个错误,它因为Composite id而无法创建CRUD。

我该如何解决这个问题?

1 个答案:

答案 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类。

希望这有帮助!