Yii의 ActiveRecord는 MVC의 M(모델 레이어), ORM의 O(객체)인 데이터베이스를 다루는 클래스입니다.
자주 묻는 질문입니다. 최근 그룹 내 피드백을 통해 아직도 이 문제를 이해하지 못하는 분들이 많다는 것을 느꼈습니다. 오늘은 이 문제를 명확하게 설명했습니다. yii2 ActiveRecord의 다중 테이블 연결과 이 연결을 최적화하는 방법을 살펴보겠습니다.
시나리오 요구 사항:
사용자 테이블 user와 사용자 채널 테이블 auth가 있다고 가정합니다. 두 데이터 테이블은 user.id와 auth.uid를 통해 일대일로 관련되어 있습니다. 이제 사용자 목록에 auth 테이블의 소스 채널 소스를 표시해야 하며 해당 채널은 검색 가능해야 합니다.
먼저 gii를 통해 사용자 및 인증 시리즈 관련 모델과 작업을 생성합니다. 여기서 자세한 설명은 제공되지 않습니다. xxx
를 참조하세요. 중요한 단계를 계속 살펴볼 것입니다.
1. 해당 AR 모델 클래스를 찾습니다. 사용자 테이블에
/** * 关联auth表 */ public function getAuth() { // hasOne要求返回两个参数 第一个参数是关联表的类名 第二个参数是两张表的关联关系 // 这里uid是auth表关联id, 关联user表的uid id是当前模型的主键id return $this->hasOne(common\models\Auth::className(), ['uid' => 'id']); }
이 유형의 파일에 연결하십시오.
설정한 후에는 두 데이터가 테이블이 자동으로 연결됩니다! 사용자 목록 페이지를 방문합니다(목록 페이지는 gii에 의해 생성되었으며 지금까지 운영하지 않았습니다). 디버그를 통해 데이터베이스 쿼리를 보면 실제 쿼리가 auth 테이블과 연결되어 있지 않음을 찾는 것이 어렵지 않습니다. 🎜>
2. 그리드뷰에서 소스 채널 필드 source<?= GridView::widget([ // other codes 'columns' => [ // other columns 'auth.source', ] ]); ?>
$query = User::find(); $query->joinWith(['auth']); $query->select("user.*, auth.source");
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);
public $source; public function rules() { return [ // other rules ['source', 'safe'], ]; }
// 'auth.source', [ 'attribute' => 'source', 'value' => 'auth.source', 'label' => '渠道来源', ],
$query->andFilterWhere([ // other params 'auth.source' => $this->source, ]);
$model.toArray();
ActiveRecord는 단순한 배열이 아니기 때문입니다. , 직접 json_encoded될 수 없습니다. 그렇지 않으면 정보가 불완전합니다.
해결책: $model.toArray(); 이는 이를 간단한 배열로 변환하고 json_encoded할 수 있습니다.
$nIdcId = idc_info::model()->find('name like :name',array(':name'=>"%".$strIdcName."%"))->id;
$idc = Idc::model()->find("..."); $id = $idc->id;
$accModel = call_user_func(array(ActiveRecordName, 'model')); $model = $accModel->findByPk($id);