Я думаю, что вам может не понадобиться операции 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-операциями.
Надеюсь, это поможет!
Это то, что я сделал после игры с ним в течение часа или около того. Благодарим вас за подробное руководство. – Steve
Лучше поздно, чем никогда. :) Рад, что проблема решена. – korsosa
Ты отличный человек! – Steve