2013-08-06 3 views
0

Yii에 새로운 브랜드, PHP는 처음이 아닙니다. Larry Ullman이 Yii를 제공하는 자습서에서 Employees MySQL 테이블과 Department 테이블을 설정했습니다. Employee 테이블에는 department와 관계가있는 departmentId 열이 있으며 ID를 가져오고 해당 부서의 이름을 가져옵니다.Yii - 여러 부서

하지만 여기에 내 문제가 있습니다. 회사 직원은 여러 부서 (예 : 고객 서비스 및 기술 지원 부서)에 떠있을 수 있습니다. 현재 Yii 설정은 단일 부서를 가져 오도록 설정되어있는 것으로 보입니다. 쉼표 또는 쉼표로 구분 된 직원 (예 : |)으로 여러 부서 ID를 입력 할 수 있도록하려면 어떻게해야합니까? Yii가 해당 직원을 끌어 내리면 해당 직원을 해고하고 해당 직원의 모든 부서를 나열 할 수 있습니까?

나는이 너무 일반적되는 라인에 경계 알고, 그래서 모델에 직원의 관계를 포함하는 아래 내 코드의 일부 게시 한 : 대신를 사용

public function relations() 
{ 
    // NOTE: you may need to adjust the relation name and the related 
    // class name for the relations automatically generated below. 
    return array(
     'department' => array(self::Belongs_To, 'Department', 'departmentId'), 
    ); 
} 

답변

3

n : m 관계가 필요합니다. 따라서 한 직원을 여러 부서에 할당하고 한 부서에는 많은 직원이 할당 될 수 있습니다.

tbl_employee (ID, 이름, 나이, 등) (employee_id입니다, department_id) tbl_department (ID, 이름 tbl_employee_department : 는 당신이 필요로하는 것은 다음과 같은 하나 개 이상의 부서에 직원을 연결하는 소위 피벗 테이블 등)

는 이제 직원의 관계는 다음과 같이 보일 것이다 :

public function relations() 
{ 
    return array(
     'employees' => array(self::MANY_MANY, 'Employee', 'tbl_employee_department(employee_id, department_id)'), 
    ); 
} 
012 : 같을 것이다

public function relations() 
{ 
    return array(
     'departments' => array(self::MANY_MANY, 'Department', 'tbl_employee_department(employee_id, department_id)'), 
    ); 
} 

그리고 부서 관계를

이제 $ employee-> departments는 여러 부서 모델의 배열을 반환합니다. 그러나 당신이 양식에 대해 원하는 것은 arrayof 부서 식별자입니다, 그래서 당신은

public $departmentIds=array(); 

public function afterFind() 
{ 
    if(!empty($this->departments)) { 
     foreach($this->departments as $id=>$department) 
      $this->departmentIds[]=$department->id; 
    } 
    parent::afterFind(); 
} 

public function afterSave() 
{ 
    $tx = Yii::app()->db->beginTransaction(); 
    try { 
     //delete all connections from this employee to any department first 
     $command = Yii::app()->db->createCommand(); 
     $command->delete('tbl_employee_department', 'employee_id=:id', array(':id'=>$this->id)); 
     //now reconnect the employee to the departments in the departmentIds array 
     foreach($this->departmentsIds as $id) { 
      $command = Yii::app()->db->createCommand(); 
      $command->insert('tbl_employee_department', array(
       'employee_id' => $this->id, 
       'department_id'=> (int)$id 
      )); 
     } 
     $tx->commit(); 
    } catch (Exception $e) { 
     $tx->rollback(); 
     throw new CException('Something bad happend. Cancelled transaction and rolled back data! '.$e->getMessage()); 
    } 

    parent::afterSave(); 
} 

이 코드는 데이터베이스에서 부서를 가져와 당신 자마자 $ departmentIds 배열에서 자신의 ID를 저장하여 직원 모델에서이 작업을 수행해야 Employee :: model() -> find() 등을 통해 데이터베이스에서 직원 모델을 가져온다. $ employee-> save()를 호출하고 저장 프로세스가 성공하면 afterSave 메소드가 호출됩니다. 그런 다음이 직원과 그가 할당 된 모든 부서 간의 모든 연결을 삭제 한 트랜잭션을 시작한 다음 departmentIds 배열에 저장된 모든 부서를 추가합니다.당신은 당신이 안전 선언해야합니다) $ 모델 -> setAttributes (를 통해이 분야를 설정하려면

당신의 직원 규칙이 넣어 (그래서 YII는 대량 할당 할 수 있습니다)

public function rules() 
{ 
    return array(
     //...all the other rules... 
     array('departmentIds', 'safe'), 
    ); 

}

아시다시피, 꽤 복잡해 보입니다.하지만 제 생각에는 그 아이디어가 있어야합니다. 왼쪽의 유일한 문제는 양식을 통해 departmentIds 배열의 ID를 설정하는 것입니다.하지만이를 수행하기 위해 texfield 문자열을 분해 할 수 있습니다.이게 그렇게 어렵지는 않습니다.

+0

위의 변경을 시도했습니다. 피벗 테이블 이름을 EmployeeDepts로 수정했습니다. 나는 오류가 발생했습니다 : ** 'departments.EmployeeDepts (employeeId'in 'where 절'실행 된 SQL 문은 SELECT \'departments \'. \'id \ 'AS \'t1_c0 \', \'departments \ (EmployeeDepts (employeeId \'= : ypl0) AND (\'departments \') '와 같은) . \'departmentId) \'= : ypl1) ** – jcsbrotha

+0

내 관계는 다음과 같이 보입니다 :' 'departments'=> 배열 (self :: HAS_MANY, 'Department', 'EmployeeDepts (employeeId, departmentId)')' – jcsbrotha

+0

그것은 테이블을 다른 테이블로 인식하지 못하는 것 같지만 부서 테이블을 사용하는 대신 올바른 테이블을 가리키는 방법은 무엇입니까? – jcsbrotha

0

을 '에 속하는 '관계 유형을 사용하려면 모델에'많은 것 '관계를 사용해야합니다. 모델 관계에 대한 자세한 내용 here. | ID :

Employees_Departments :

'많은 많은'관계는, 같은 것을에서 이러한 관계를 저장하기 위해 다른 테이블을 추가해야 employee_id | department_id

그러면 employee 테이블에서 department_id 열을 제거 할 수 있습니다.

도움이 되었기를 바랍니다.

+0

도움 주셔서 감사합니다. 그것이 내가 생각하고 시작한 일이었습니다. 당신이 지금 나의 새로운 문제에 대한 개선을 사용할 수있는 것을 본다면 위의 @haensel의 충고를 따르는 Im. 다시 한 번 감사드립니다! – jcsbrotha