4

나는 세 개의 테이블을 가지고 부모 개체가 있는지 여부를 모르는 개체를 저장하는 방법은 무엇입니까?

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

직원의

는 외래 키로 office_id하고 사무실은 외래 키로 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...... 
    } 

} 

그러나 너무 많은 중복 논리가 있으며 매우 확장 성/지저분합니다.

그럼 어떻게해야합니까?

두 번째로 논리는 어디로 가야합니까? 그것은 직원의 매퍼로 가야합니까? 또는 '직원 추가'작업의 컨트롤러 또는 새 모델이 있어야합니까?

그래서 상관없이 프레임 워크 환경 :)의 반응 주시기 바랍니다 내 프레임 워크로 젠드를 사용하고 있지만이 문제는 모든 MVC 스타일의 구조에 적용 생각

+2

그것은이다 좋은 질문이지만 MVC와는 아무런 관련이 없다고 생각합니다. 또한 다른 어떤 것보다 데이터 맵퍼에 관한 것입니다. 실제로 누군가가 자신의 앱을 일부 신에게 끔찍한 ORM 방지 패턴으로 부딪히지 않는 질문을 보는 것이 좋습니다. 그래서 +1. – rdlowrey

+0

datamapper 태그를 추가했습니다 : – Mark

답변

3

당신이 만약 (시 사용하거나 진술하는 경우) if 문 안에 블록을 넣고 쿼리를 넣으면 IF 문 첫 부분이 실패 할 경우에만 실행되고 쿼리를 불필요하게 수행하지 않게됩니다. 개인적으로 우리는 비슷한 일을하지만 우리는 새 도메인을 만들 때 우리는 = 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); 
} 
+0

+1 'new'속성. 나는이 해결책을 많이 좋아한다. – Mark