2014-12-16 1 views
0

Итак, у меня есть много-много отношений между двумя таблицами, которые являются «Item» и «Tier», и у меня есть промежуточная таблица «Item_Tier», в которой оба Fks действуют как Pks который сделает ключ составным.Сделать CRUD для таблицы с композитом в yii

Теперь я пытаюсь сделать простой CRUD для промежуточной таблицы, и я знаю, что Yii имеет ограничение, которое не может создать CRUD для таблиц с составными ключами. Я увлекаюсь расширением Giix, который рекламирует, что он поддерживает CRUD для составных клавиш.

Теперь я последовал за процессом установки, и я вижу, что он добавлен в мой Gii, потому что я могу видеть генератор модели Giix и модель. Я создал модель с Giix и gii, чтобы убедиться, что она не имеет эффекта, и она все еще дает мне ошибку, что она не может создать CRUD из-за идентификатора Composite.

Как я могу исправить это, пожалуйста?

ответ

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

Итак, теперь вы можете прочитать пункты для уровня и ярусы для элемента. Тогда вы можете создать функцию AddItem ($ пункт) в классе Tier (или addTier ($ ярус) в классе пункт, подобный этому)

Добавить соединение:

// 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; 
} 

сейчас вы можете также назначить элементы на ярусы и уровни для пунктов (если вы реализуете Similary метода в классе 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; 
} 

И обновление эквивалентно удалению соединения и добавлению нового соединения. Таким образом, вам не нужно создавать новый класс AR для таблицы соединений с crud-операциями.

Надеюсь, это поможет!

+1

Это то, что я сделал после игры с ним в течение часа или около того. Благодарим вас за подробное руководство. – Steve

+0

Лучше поздно, чем никогда. :) Рад, что проблема решена. – korsosa

+0

Ты отличный человек! – Steve