Yii 2 Active Record 다 중 표 관련 및 다 중 표 관련 검색 실현

Yii 의 Active Record 는 데이터베이스 와 접촉 하 는 클래스,즉 MVC 의 M(모델 층)이자 ORM 의 O(Object)이다.
상투적인 문제.최근 군중 의 피드백 을 통 해 많은 사람들 이 여전히 이 문 제 를 이해 하지 못 하고 있다 고 느낀다.오늘 이 문 제 를 명확 하 게 설명 하고 yii 2 Active Record 가 어떻게 여러 표 의 관련 이 있 는 지,그리고 이 관 계 를 어떻게 최적화 하 는 지 보 겠 습 니 다.
필드 요구:
만약 에 저희 가 사용자 표 user 와 사용자 채널 표 auth 가 있다 고 가정 하면 두 장의 데이터 표 는 user.id 와 auth.uid 를 통 해 일대일 로 연 결 됩 니 다.현재 user 목록 에서 auth 표 의 소스 채널 source 를 보 여 주 고 이 채널 은 검색 할 수 있 습 니 다.
우선 gii 를 통 해 user 와 auth 시리즈 와 관련 된 model 과 작업 을 생 성 합 니 다.여기 서 상세 한 설명 을 하지 않 습 니 다.gii 에 관 한 조작 은 xxx 를 참고 할 수 있 습 니 다.
내 가 보기에 중요 한 몇 가지 조작 절 차 를 계속 볼 것 이다.
1.user 표 에 대응 하 는 AR 모델 클래스 common\models\User.php 를 찾 아 이 파일 에서 auth 표를 연결 합 니 다.

/**
*   auth 
*/
public function getAuth()
{
// hasOne                                     
//   uid auth   id,   user  uid id        id
return $this->hasOne(common\models\Auth::className(), ['uid' => 'id']);
}
설정 이 되 어 있다 고 해서 두 장의 데이터 시트 가 자동 으로 연결 되 는 것 은 아 닙 니 다!user 목록 페이지 에 접근 합 니 다.(이 목록 페이지 는 gii 로 생 성 되 었 습 니 다.현재 조작 되 지 않 았 습 니 다)debug 를 통 해 Database Queries 를 보 는 것 은 어렵 지 않 습 니 다.실제 query 는 관련 auth 표를 진행 하지 않 았 습 니 다.
2.gridview 에 관련 표 의 소스 채널 필드 source 를 추가 합 니 다.

<?= GridView::widget([
// other codes
'columns' => [
// other columns
'auth.source',
]
]); ?>
어떤 학생 이 의문 을 느 꼈 어 요.위 에서 관련 이 없다 고 했 잖 아 요.이 걸 어떻게 auth.source 를 직접 사용 할 수 있어 요?
서 두 르 지 마 세 요.이때 debug 를 열 어 실제 query 를 보 겠 습 니 다.
우 리 는 select*from'auth'where uid=xxx 와 유사 한 것 을 많이 발견 할 것 이다.페이지 의 기본 20 개의 데 이 터 를 나 눌 때 20 개의 유사 한 query 가 있 습 니 다.
우리 먼저 무슨 일이 일 어 났 는 지 알 아 볼 까요?
사실 이것 은 php 의 기초 지식 에 속한다.대상 에 존재 하지 않 는 구성원 변 수 를 읽 고 기록 할 때get() __set()마술 함수 가 자동 으로 호출 됩 니 다.yii 도 이 점 을 이용 하여 이 루어 졌 습 니 다!
이 조작 은 대부분의 사람들 이 gridview 에서 패 키 징 방법 으로 관련 표 데 이 터 를 얻 는 것 과 거의 일치 하지만!20 개의 sql 조 회 는 많은 비용 을 현저히 증가 시 켰 다.여기 가 left join 이 라면 얼마나 좋 을 까!
3.sql 최적화
우리 가 최적화 해 야 할 것 은:
20 개 sql 변 1 개 sql
관련 표 에 필요 한 필드 만 가 져 오기
어떤 학우 가 떠 들 려 고 하 는데,여 기 는 yii 가 가지 고 있 는 조작 인 데,어떻게 최적화 합 니까?우 리 는 데이터 원본 의 획득 으로 돌아 가서 user 목록 의 데 이 터 는 userSearch model 의 search 방법 을 통 해 제공 되 는 것 을 발견 했다.
즉,우리 의 데이터 조 회 는 실제로 관련 표를 조회 하지 않 았 다 는 것 이다!그렇다면 UserSearch 에 관련 조 회 를 추가 하 겠 습 니 다.

$query = User::find();
$query->joinWith(['auth']);
$query->select("user.*, auth.source");
우 리 는 user 목록 페이지 를 다시 갱신 한 후에 debug 분석 을 통 해 두 개의 sql 이 우리 의 주 의 를 끌 었 다 는 것 을 발견 했다.

SELECT `user`.*, `auth`.`source` FROM `user` LEFT JOIN `auth` ON `user`.`id` = `auth`.`uid` LIMIT 20
SELECT * FROM `auth` WHERE `user_id` IN (20 uid);
즉,우리 가 sql 을 최적화 하 는 목적 을 달성 했다 는 것 이다.debug 분석 을 통 해 DB 의 조회 시간 이 많이 줄 었 다 는 것 을 알 수 있다.
4.관련 표 필드 추가 조회
gridview 의 검색 모델 도 searchModel 을 통 해 이 루어 집 니 다.이 모델 은 rules 를 통 해 어떤 필드 를 검색 할 수 있 는 지,어떤 필드 를 검색 할 수 없 는 지 제어 합 니 다.
검색 가능 한 관련 표 의 source 를 추가 해 야 합 니 다.따라서 searchModel 에서 속성 source 를 정의 하고 rules 에 추가 합 니 다.

public $source;
public function rules()
{
return [
// other rules
['source', 'safe'],
];
}
이어서 gridview 의 auth.source 를 수정 하 겠 습 니 다.

// 'auth.source',
[
'attribute' => 'source',
'value' => 'auth.source',
'label' => '    ',
],
여기 서 우리 인터페이스 는 ok 입 니 다.프로그램의 검색 을 실현 하려 면 아직 한 걸음 이 부족 합 니 다.우 리 는 데이터 원본 이 가 져 온 곳 에 새로 추 가 된 source 조건 을 추가 하면 됩 니 다.

$query->andFilterWhere([
// other params
'auth.source' => $this->source,
]);
다음은 yii 에서 ActiveRecord 의 용법 을 보충 해 드 리 겠 습 니 다.
1,대상 트랜스 퍼 그룹
$model = new ActiveRecord();
$model.toArray();
ActiveRecord 는 단순 한 배열 이 아니 기 때문에 직접 jsonencode,그렇지 않 으 면 정보 가 완전 하지 않 습 니 다.
해결 방법:$model.toArray();이렇게 하면 간단 한 배열 로 변 합 니 다.제 이 슨 을 진행 할 수 있 습 니 다.encode 입 니 다.
2.이름 이나 다른 필드 를 통 해 ActiveRecord 의 id 를 직접 가 져 옵 니 다.

$nIdcId = idc_info::model()->find('name like :name',array(':name'=>"%".$strIdcName."%"))->id; 
내 가 예전 에 자주 사 용 했 던 방법 은(지금 은 촌 스 러 운 것 을 발견 했다):

$idc = Idc::model()->find("..."); 
$id = $idc->id; 
3.모델 에 대한 이해

$accModel = call_user_func(array(ActiveRecordName, 'model')); 
$model  = $accModel->findByPk($id); 
위 에서 말씀 드 린 것 은 편집장 님 께 서 소개 해 주신 Yi 2 Active Record 다 표 관련 및 다 표 관련 검색 의 실현 에 관 한 지식 입 니 다.도움 이 되 셨 으 면 좋 겠 습 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.편집장 님 께 서 바로 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기