I don't understand what you're going to approach, but you can do something like this with your models:
POJO (Plain Old Java Objects) by extending CActiveRecord.
ContentItem class:
<?php
class ContentItem extends CActiveRecord
{
public static function model($className=__CLASS__)
{
return parent::model($className);
}
public function tableName()
{
return 'contentItems';
}
public function rules()
{
return array(); //replace with what the class needs to be validated
}
public function relations()
{
return array(
'videos' => array(self::HAS_MANY, 'Video', 'contentItemId'),
'photos' => array(self::HAS_MANY, 'Photo', 'contentItemId')
);
}
}
Video class:
<?php
class Video extends CActiveRecord
{
public static function model($className=__CLASS__)
{
return parent::model($className);
}
public function tableName()
{
return 'videos';
}
public function rules()
{
return array(); //replace with what the class needs to be validated
}
public function relations()
{
return array(
'contentItems' => array(self::BELONGS_TO, 'ContentItem', 'contentItemId')
);
}
}
Photo class:
<?php
class Photo extends CActiveRecord
{
public static function model($className=__CLASS__)
{
return parent::model($className);
}
public function tableName()
{
return 'photos';
}
public function rules()
{
return array(); //replace with what the class needs to be validated
}
public function relations()
{
return array(
'contentItems' => array(self::BELONGS_TO, 'ContentItem', 'contentItemId')
);
}
}
The Manager Classes is where you actually do your structure models:
ContentManager class:
<?php
class ContentManager
{
public function createAction(ContentItem $contentItem)
{
$contentItem->save();
}
public function updateAction(ContentItem $contentItem)
{
$contentItem->update();
}
public function deleteAction(ContentItem $contentItem)
{
$contentItem->delete();
}
public function getContent($id)
{
return ContentItem::model()->findByPk($id);
}
}
VideoManager class:
<?php
class VideoManager extends ContentManager
{
public function createAction(ContentItem $contentItem, Video $video)
{
$transaction = $contentItem->dbConnection->beginTransaction();
try {
$contentItem->save();
$video->save();
$transaction->commit();
} catch (Exception $e)
{
echo '<p>'.$e->getMessage().'</p>';
$transaction->rollback();
}
}
public function updateAction(ContentItem $contentItem, Video $video)
{
$transaction = $contentItem->dbConnection->beginTransaction();
try {
$contentItem->update();
$video->update();
$transaction->commit();
} catch (Exception $e)
{
echo '<p>'.$e->getMessage().'</p>';
$transaction->rollback();
}
}
public function deleteAction(ContentItem $contentItem, Video $video)
{
$contentItem->delete();
$video->delete();
}
public function getVideos($id)
{
$video= ContentItem::model()->with('videos', 'videos.duration')->findByPk($id);
}
}
Also for the PhotoManager would be the same like VideoManager. I have not tested those just a quick scratchy codes.