このような場合に私が何をするかをお伝えできます。データの山を取得し、そこから複数のオブジェクトを構築する必要があるときはいつでも、混乱全体を別のモデル (おそらくサービス層、私にはわかりません) にダンプし、コントローラーからオブジェクトを整理します。コントローラーを使用してデータを取得し、別の場所 (ビューまたはモデル) に送信するだけです。
たとえば、音楽コレクションからいくつかのデータを保存したいのですが、データは現在csvファイルにあります。私のコントローラーはcsvファイルを解析し、データの各行を配列に入れ、データをオブジェクトにソートしてデータベースに保存するクラスメソッドに転送します。(この方法は予備的なものであり、微調整と調整が必要であることに注意してください)
//FROM class Application_Model_Tag
public function saveTags() {
//TODO implement instantiation of Domain Models instead of passing arrays to mappers
$trackMapper = new Music_Model_Mapper_Track();
$artistMapper = new Music_Model_Mapper_Artist();
$albumMapper = new Music_Model_Mapper_Album();
if (isset($this->_hash)) {
//see if track already exists by comparing hashs
$trackRow = $trackMapper->fetchByColumn('hash', $this->getHash());
//if track does not exist
if (is_null($trackRow)) {
//save the artist
$artistData = array(
'name' => $this->getArtist()
);
//see it the artist exists by name
$artistRow = $artistMapper->fetchByColumn('name', $this->getArtist());
//does artist exist?
if (is_null($artistRow)) {
$artistRow = $artistMapper->save($artistData);
}
//Save the Album Data
//does the album exist?
$albumRow = $albumMapper->fetchByColumn('name', $this->getAlbum());
//if yes
if (is_null($albumRow)) {
$albumData = array(
'name' => $this->getAlbum(),
'artist_id' => $artistRow->id,
'art' => $this->getAlbum() . '.jpg',
'year' => $this->getYear()
);
//get album row
$albumRow = $albumMapper->save($albumData);
}
//Save track data
$trackData = array(
'title' => $this->getTitle(),
'filename' => $this->getFilename(),
'path' => $this->getPath(),
'format' => $this->getFormat(),
'genre' => $this->getGenre(),
'artist_id' => $artistRow->id,
'album_id' => $albumRow->id,
'track' => $this->getTrack(),
'play_time' => $this->getPlay_time(),
'hash' => $this->getHash()
);
//save track data
$trackMapper->save($trackData);
}
} else {
return;
}
}
これがお役に立てば幸いです。例の粗雑さをお許しください。