>  기사  >  백엔드 개발  >  Yii2는 MySQL 간 데이터베이스 관련 쿼리 정렬 기능 코드를 구현합니다.

Yii2는 MySQL 간 데이터베이스 관련 쿼리 정렬 기능 코드를 구현합니다.

高洛峰
高洛峰원래의
2017-02-15 15:34:211611검색

이 글은 주로 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([
 &#39;dataProvider&#39; => $dataProvider,
 &#39;columns&#39; => [

  //其他列
  
  [
   &#39;label&#39; => &#39;统计数据&#39;,
   &#39;value&#39; => function($model){
    return isset($model->stat->data) ? $model->stat->data : null;
   }
  ],
  
  //其他列
 ],
]); ?>

이제 사용자 GridView 목록에서 통계 데이터를 정렬하고 필터링하는 요구 사항이 추가되었습니다

user 및 user_stat 테이블이 동일한 데이터베이스에 있는 경우 다음을 수행할 수 있습니다.

UserSearch:

public $data;
public function rules()
{/*{{{*/
 return [
  [&#39;data&#39;], &#39;integer&#39;],
  //其他列
 ];
}/*}}}*/

public function search($params, $onlyActiveUsers = false)
{
 $query = User::find();
 $query->joinWith([&#39;stat&#39;]);

 $dataProvider = new ActiveDataProvider([
  &#39;query&#39; => $query,
  &#39;sort&#39; => [
   &#39;attributes&#39; => [
    //其他列
    
    &#39;data&#39; => [
     &#39;asc&#39; => [UserStat::tableName() . &#39;.data&#39; => SORT_ASC],
     &#39;desc&#39; => [UserStat::tableName() . &#39;.data&#39; => SORT_DESC],
    ],
    
    //其他列
   ],
   &#39;defaultOrder&#39; => [
    &#39;id&#39; => SORT_DESC,
   ],
  ],
  &#39;pagination&#39; => [
   &#39;pageSize&#39; => 50,
  ],
 ]);

 $this->load($params);

 if (!$this->validate()) {
  $query->where(&#39;0=1&#39;);
  return $dataProvider;
 }

 $query->filterWhere([
 
  //其他列
  
  UserStat::tableName() . &#39;.data&#39; => $this->data
 ]);

 return $dataProvider;
}

in GridView 이렇게 사용하면 통계 데이터를 표시하고 정렬할 수 있습니다

<?= GridView::widget([
 &#39;dataProvider&#39; => $dataProvider,
 &#39;columns&#39; => [

  //其他列
  
  [
   &#39;label&#39; => &#39;统计数据&#39;,
   &#39;attribute&#39; => &#39;data&#39;,
   &#39;value&#39; => function($model){
    return isset($model->stat->data) ? $model->stat->data : null;
   }
  ],
  
  //其他列
 ],
]); ?>

검색 양식에 다음 열을 추가하여 필터링

<?php $form = ActiveForm::begin(); ?>
//其他列 

<?= $form->field($model, &#39;data&#39;)?>

//其他列
<p class="form-group">
 <?= Html::submitButton(&#39;Search&#39;, [&#39;class&#39; => &#39;btn btn-primary&#39;]) ?>
</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 중국어 웹사이트를 주목하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.