AR(Active Record)을 사용하여 단일 데이터 테이블에서 데이터를 가져오는 방법을 살펴보았습니다. 이 섹션에서는 AR을 사용하여 여러 관련 데이터 테이블을 연결하고 조인된 데이터 세트를 검색하는 방법을 설명합니다.
관계형 AR을 사용하려면 관련이 필요한 테이블에 기본 키-외래 키 제약 조건을 정의하는 것이 좋습니다. 이러한 제약 조건은 관련 데이터의 일관성과 무결성을 보장하는 데 도움이 될 수 있습니다.
이 예제에서는 Yii Framework Development Tutorial(25)의 데이터베이스-쿼리 빌더 예제를 수정하여 여러 관련 테이블에 대해 Active Record를 사용하는 방법을 소개합니다.
AR을 사용하여 관련 쿼리를 수행하기 전에 하나의 AR 클래스가 다른 AR 클래스와 어떻게 관련되어 있는지 AR에 알려야 합니다.
두 AR 클래스 간의 관계는 AR 클래스가 표현하는 데이터 테이블 간의 관계를 통해 직접적으로 연관됩니다. 데이터베이스 관점에서 테이블 A와 B 사이에는 일대다(예: tbl_user 및 tbl_post), 일대일(예: tbl_user 및 tbl_profile) 및 다대일 다(예: 다대일)의 세 가지 유형의 관계가 있습니다. tbl_category 및 tbl_post와 같은 다대다). AR에는 네 가지 관계가 있습니다.
BELOONGS_TO(속함): 테이블 A와 B 간의 관계가 일대다인 경우 테이블 B는 테이블 A에 속합니다(예: Post는 User에 속함). );
HAS_MANY(여러 개가 있음): 테이블 A와 B 사이의 관계가 일대다인 경우 A에는 여러 개의 B가 있습니다(예: 사용자에게 여러 게시물이 있음). >HAS_ONE(하나 있음): 이는 HAS_MANY의 특별한 경우입니다. A는 최대 하나의 B를 가질 수 있습니다(예: 사용자는 최대 하나의 프로필을 가질 수 있습니다).
MANY_MANY: 이는 다수에 해당합니다. 데이터베이스의 대다 관계. 대부분의 DBMS는 다대다 관계를 직접 지원하지 않기 때문에 다대다 관계를 일대다 관계로 분할하려면 관계 테이블이 필요합니다. 예제 데이터 구조에서는 tbl_post_category가 이 목적으로 사용됩니다. AR 용어로 MANY_MANY를 BELONGS_TO와 HAS_MANY의 조합으로 해석할 수 있습니다. 예를 들어 Post는 Many(belongs to Many) Category에 속하고 Category는 Many(has Many) Post에 속합니다.
AR에 정의된 관계는 CActiveRecord의 관계() 메서드를 재정의해야 합니다. 이 메서드는 관계 구성의 배열을 반환합니다. 각 배열 요소는 다음 형식으로 단일 관계를 나타냅니다.
쿼리 작성기에서 다음 SQL 쿼리 문을 사용했습니다.
SELECT c.FirstName, c.LastName , c.Address,c.Email FROM customer c INNER JOIN employee e ON c.SupportRepId=e.EmployeeIde.EmployeeId=4가 Employee와 Customer라는 두 테이블을 포함합니다. 다중 관계를 의미합니다. 한 명의 직원이 여러 고객을 책임질 수 있다는 것입니다. 직원과 고객 간의 관계는 HAS_MANY이고, 고객과 직원 간의 관계는 HAS_ONE입니다. 따라서 Employee와 Customer는 다음과 같이 정의할 수 있습니다.
//Customer.phpclass Customer extends CActiveRecord{ public static function model($className=__CLASS__){return parent::model($className);} public function tableName(){return 'Customer';} } //Employee.phpclass Employee extends CActiveRecord{ public static function model($className=__CLASS__){return parent::model($className);} public function tableName(){return 'Employee';} public function relations(){return array('customers'=>array(self::HAS_MANY, 'Customer', 'SupportRepId'), );}}
public function actionIndex(){ $employee=Employee::model()->findByPk(4); $this->render('index', array('model' => $employee->customers, ));}
이 예에서는 일부 경우에 효율적이지 않은 지연 로딩을 사용합니다. N개의 게시물 작성자를 얻으려는 경우 이 지연 로딩을 사용하면 N개의 조인 쿼리가 실행됩니다. 이 경우 대신 Eager 로딩을 사용해야 합니다.
eager loading 메서드는 기본 AR 인스턴스를 가져오는 동시에 관련 AR 인스턴스도 가져옵니다. 이는 AR에서 find 또는 findAll 메소드를 사용할 때 with 메소드를 사용하여 수행됩니다. 예:
$employee=Post::model()->with ('customers')->findAll();
$customer){ echo 'First Name:' . $customer->FirstName . ''; echo 'Last Name:' . $customer->LastName . ''; echo 'Address:' . $customer->Address . ''; echo 'Email:' . $customer->Email . ''; echo '----------------------';} ?>
이 예제에서는 연관된 Active Record의 가장 기본적인 사용법을 소개합니다. 기타 기능 및 속성에 대해서는 Yii 중국어 설명서를 참조하세요. 데이터베이스 정의 ActiveRecord 코드를 자동으로 생성하면 프로그래머의 수동 코딩 작업량을 크게 줄일 수 있습니다.
게다가 Active Record를 사용하면 성능이 떨어지기 때문에 일반적으로 DAO를 사용하여 데이터베이스를 읽고 쓰는 것보다 성능이 한 단계 떨어집니다. 다음 표는 배우 200명, 영화 1000편을 찾기 위한 참고값이다.
위 내용은 PHP 개발 프레임워크 Yii Framework 튜토리얼(27) 데이터베이스 관련 Active Record 예시 내용입니다. 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!