4

私は3つのテーブルを持っています、

Business:
  id
  name
Office:
  id
  name
  business_id
Employee:
  id
  name
  office_id

Employee は office_id を外部キーとして持ち、Office は business_id を外部キーとして持ちます。

それぞれに関連するドメイン オブジェクト/エンティティと、それぞれに関連するデータベース マッパー オブジェクトがあります。

ビジネス名、オフィス名、従業員名から提供されたときに新しい従業員を挿入する方法は?

最初に、ロジックは次のようになるはずだと思います。

$businessMapper = new businessMapper();  
$business = $businessMapper->findBusinessByName($business_name);

if ($business == false) {   
     $business = new businessEntity(array(         
                     'businessName' => $business_name,            
                   ));        
     $businessMapper->save($business);   
  } 

 $officeMapper = new officeMapper();     
 $office = $officeMapper->getOfficeByName($office_name, $business);

.......etc.......

しかし、その後、新しいビジネスを保存する必要がある場合、オフィスや従業員を確保する方法がないため、それらを取得しようとするのは無駄なクエリであることに気付きました. そこで、if/else 構造を作成する必要があると考えました。

get business entity by business_name  
if ($business == false) {
    create business entity
    save business entity
    create office entity
    save office entity
    create employee entity
    save employee entity
} else {
   get office entity by office_name + business_id

   if (office == false) {
     create office entity
     save office entity
     create employee entity
     save employee entity

   } else {

     ......etc......
   }

}

しかし、非常に多くの重複したロジックがあり、非常に拡張性が低く、汚れています。

では、それはどのように達成されるべきでしょうか?

そして第二に、ロジックはどこに行くべきですか?従業員のマッパーに入るべきですか?または「従業員の追加」アクションのコントローラーですか、それとも新しいモデルが必要ですか?

フレームワークとして Zend を使用していますが、質問はすべての MVC スタイル構造に当てはまると思いますので、フレームワークの好みに関係なく、お気軽に回答してください :)

4

1 に答える 1

3

if() ブロック中に OR ステートメントを使用し、クエリを if ステートメント内に配置すると、IF ステートメントの最初の部分が失敗した場合にのみ実行され、不必要にクエリを実行しないようにします。個人的には同様のことを行いますが、新しいドメインを作成するときに、ドメイン new=1 にフラグを設定し、代わりにこれをチェックします。同じ方法により、これらのダーティ変数の必要がなくなります ;-)

$businessMapper = Factory::getMapper('business');

if (!$business = $businessMapper->findByName("Business Name"))
{
    $business = $businessMapper->create();
    $business->setName("Business Name");
    $businessMapper->save($business);

    $newBusiness = true;
}

$officeMapper = Factory::getMapper('office');

if (isset($newBusiness) || !$office = $officeMapper->findByName("Office Name"))
{
    $office = $officeMapper->create();
    $office->setName("Office Name");
    $office->setBusiness($business->getId());
    $officeMapper->save($office);

    $newOffice = true;
}

$employeeMapper = Factory::getMapper('employee');

if (isset($newOffice) || !$employee = $employeeMapper->findByName("Employee"))
{
    $employee = $employeeMapper->create();
    $employee->setName("Employee Name");
    $employee->setOffice($office->getId());

    $employeeMapper->save($employee);
}
于 2012-07-18T23:02:00.130 に答える