이 글은 주로 Yii2의 크로스 MySQL 데이터베이스 관련 쿼리 정렬 기능 구현 사례를 소개합니다. 이는 특정 참조 값이 있으며 관심 있는 친구들이 참조할 수 있습니다.
배경: mysql 서버에 두 개의 데이터베이스가 있습니다(참고: 두 데이터베이스는 동일한 mysql 서버에 있어야 함).
메모리에 사용자 테이블이 있습니다(스토리지 일반 데이터 테이블). (사용자 정보 기록)
memory_stat에 user_stat가 있음(통계 데이터 테이블 저장) (사용자 통계 데이터 기록)
이제 사용자 테이블에서 생성된 GridView 목록의 user_stat 통계 데이터가 표시됩니다
사용자 모델 클래스에 연결을 추가하기만 하면 됩니다
public function getStat() { return $this->hasOne(UserStat::className(), ['user_id' => 'id']); }
GridView에서 사용할 수 있습니다. 통계 표시
<?= GridView::widget([ 'dataProvider' => $dataProvider, 'columns' => [ //其他列 [ 'label' => '统计数据', 'value' => function($model){ return isset($model->stat->data) ? $model->stat->data : null; } ], //其他列 ], ]); ?>
이제 사용자 GridView 목록에서 통계 데이터를 정렬하고 필터링하는 요구 사항이 추가되었습니다
user 및 user_stat 테이블이 동일한 데이터베이스에 있는 경우 다음을 수행할 수 있습니다.
UserSearch:
public $data; public function rules() {/*{{{*/ return [ ['data'], 'integer'], //其他列 ]; }/*}}}*/ public function search($params, $onlyActiveUsers = false) { $query = User::find(); $query->joinWith(['stat']); $dataProvider = new ActiveDataProvider([ 'query' => $query, 'sort' => [ 'attributes' => [ //其他列 'data' => [ 'asc' => [UserStat::tableName() . '.data' => SORT_ASC], 'desc' => [UserStat::tableName() . '.data' => SORT_DESC], ], //其他列 ], 'defaultOrder' => [ 'id' => SORT_DESC, ], ], 'pagination' => [ 'pageSize' => 50, ], ]); $this->load($params); if (!$this->validate()) { $query->where('0=1'); return $dataProvider; } $query->filterWhere([ //其他列 UserStat::tableName() . '.data' => $this->data ]); return $dataProvider; }
in GridView 이렇게 사용하면 통계 데이터를 표시하고 정렬할 수 있습니다
<?= GridView::widget([ 'dataProvider' => $dataProvider, 'columns' => [ //其他列 [ 'label' => '统计数据', 'attribute' => 'data', 'value' => function($model){ return isset($model->stat->data) ? $model->stat->data : null; } ], //其他列 ], ]); ?>
검색 양식에 다음 열을 추가하여 필터링
<?php $form = ActiveForm::begin(); ?> //其他列 <?= $form->field($model, 'data')?> //其他列 <p class="form-group"> <?= Html::submitButton('Search', ['class' => 'btn btn-primary']) ?> </p> <?php ActiveForm::end(); ?>
그러나 현실은 잔인합니다. user 및 user_stat 테이블은 동일한 데이터베이스에 있습니다.
다음과 같은 오류가 보고됩니다:
SQLSTATE[42S02]: 기본 테이블 또는 뷰를 찾을 수 없음: 1146 테이블 'memory.user_stat'이 존재하지 않습니다
실행 중인 SQL은 다음과 같습니다. ...
두 데이터베이스(동일 서버)에서 관련 데이터 쿼리를 수행하는 경우 순수 SQL 문은 다음과 같습니다.
코드 복사 코드는 다음과 같습니다.
memory.user에서 a.*,b.*를 a,memory_stat.user_stat로 b로 선택 여기서 a.id =b .user_id;
Yii2는 SQL 문으로 변환할 때 기본적으로 문 앞에 데이터베이스 이름을 추가하지 않으므로 mysql은 이 테이블을 기본값으로 사용합니다. 메모리 데이터베이스에서 sql 문을 실행할 때.
코드 복사 코드는 다음과 같습니다.
memory.user에서 a.*,b.*를 선택하세요. as a, memory.user_stat as b where a.id=b.user_id;
그래서 위의 오류 메시지가 나타납니다.
그렇다면 이 문제를 어떻게 해결해야 할까요?
사실 매우 간단합니다. user_stat의 모델 클래스 아래에 있는 tableName() 메서드만 재정의하면 됩니다.
그렇습니다 이 글의 전체 내용이 모든 사람의 학습에 도움이 되기를 바라며, 또한 모든 사람이 PHP 중국어 웹사이트를 지지해 주기를 바랍니다.
Yii2 크로스 mysql 데이터베이스 구현 관련 쿼리 정렬 기능 코드 관련 기사를 더 보려면 PHP 중국어 웹사이트를 주목하세요!