ホームページ  >  記事  >  バックエンド開発  >  Yiiマルチテーブルジョイントクエリ操作の詳細説明、Yiiジョイントクエリの詳細説明_PHPチュートリアル

Yiiマルチテーブルジョイントクエリ操作の詳細説明、Yiiジョイントクエリの詳細説明_PHPチュートリアル

WBOY
WBOYオリジナル
2016-07-12 08:51:04786ブラウズ

Yiiマルチテーブルジョイントクエリ操作の詳細な説明、Yiiジョイントクエリの詳細説明

この記事は参考のためにYiiマルチテーブルジョイントクエリを要約して説明します、具体的な内容は次のとおりです

1. 複数テーブル結合クエリの実装方法

方法は 2 つあります 1 つは、DAO を使用して SQL ステートメントを記述して実装する方法です。SQL ステートメントが正しく記述されていないことを確認する限り、この実装は比較的簡単に理解できます。欠点も明らかであり、比較的分散しており、YII の推奨フレームワークに準拠していないのが最も重要な欠点です。

それもあります 1つは、YIIに付属するCActiveRecordを使用して複数テーブルの結合クエリを実装することです

2. 全体の枠組み

ユーザーの友人関係を見つける必要があります。ユーザーの情報はユーザー テーブルに配置され、ユーザー間の関係は関係テーブルに配置され、関係の内容は関係タイプ テーブルに配置されます。明らかに、他の 2 つのテーブルをクエリするためのメイン テーブルとしてリレーショナル テーブルを使用するだけで済みます。主に実装プロセスをコードの観点から分析します。

3.Cアクティブレコード

まず 3 つのテーブルに対応するモデルを確立する必要があります。以下はリレーショナル テーブルのコードです。

ソーシャルリレーション.php

リーリー

説明の便宜上、メインテーブルをテーブルA(クエリが実行されるテーブル)、参照テーブルをテーブルB(外部キーによって参照されるテーブル)とすることに同意します

Gii を使用してモデルを自動的に生成することをお勧めします。これにより、テストの便宜上、追加、削除、変更、およびクエリ ページであるメイン テーブルに対して CRUD を生成できます。テーブルの場合は、モデルを生成するだけです。

1. このモデルとデータベーステーブルの基本情報を取得するには、model関数とtablename関数を使用します。変更せずに自動生成されます

2.rules 関数、この関数は主にパラメーターの検証方法を指定するために使用されます。一部のパラメーターは検証が必要ない場合でも、ルールに含める必要があることに注意してください。そうしないと、モデルはパラメータを取得できなくなります

3.relation関数、この関数は非常に重要であり、テーブル間の関係を定義するために使用されます。その意味については以下で詳しく説明します

'relationType' => array(self::BELONGS_TO, 'SocialRelationType', 'relation_type_id') このコードの構造は次のとおりです

'VarName'=>array('RelationType', 'ClassName', 'ForeignKey', ...追加オプション) VarName はリレーションシップの名前です。今後、この名前を使用して外部キー参照テーブルのフィールドにアクセスします。
RelationType は非常に重要な関係のタイプです。これが正しく設定されていない場合、Yii は合計 4 つのタイプの関係を提供します。

BELONGS_TO (所属): テーブル A と B の関係が 1 対多の場合、テーブル B はテーブル A に属します

HAS_MANY (複数あります): テーブル A と B の関係が 1 対多の場合、A には複数の B があります

HAS_ONE (1 つあります): これは HAS_MANY の特殊なケースで、A には最大でも 1 つの B があります

MANY_MANY: これはデータベース内の多対多の関係に対応します
ClassName は参照テーブル名であり、外部キーによって参照されるテーブルの名前であり、テーブル B の名前です

ForeignKey は外部キーの名前です。ここで主に入力するのは、メイン テーブルの外部キーの名前です。これは、テーブル A の外部キーのテーブル名です。間違って入力しないように注意してください。
テーブル B に二重の主キーがある場合、次の方法で実装できます。このアプローチは、各テーブルに独立した意味のない主キーを使用するのが最善です。そうしないと、さまざまな問題が発生しやすくなります。発生すると管理が不便になります

リーリー

追加オプション追加オプション、ほとんど使用されません

4attributeLabels関数


、これはテーブル属性の表示名で、powerdesignerのコードと名前の関係に少し似ています。最初の部分はデータベースのフィールド名で、後半は表示名です5 検索関数
。テーブル クエリの結果を生成するために使用される関数です。ここでは、具体的な使用法については説明しません。API の CDbCriteria の説明を参照してください。 Gii を使用して生成された場合、変更は必要ありません。 同様に、残りの2つの参照テーブルを生成します

関係タイプテーブル: SocialRelationType.php

リーリー

ユーザーテーブル: AccessUser.php

リーリー

4.コントローラー

3 つのテーブルを導入した後、同様に、Gii を使用してメイン テーブル (テーブル A) の CRUD を生成し、それにいくつかの変更を加えるだけです。コードは次のとおりです。

SocialRelationController.php
リーリー
各関数と変数の簡単な紹介

$layout はレイアウト ファイルの場所です。レイアウト ファイルの使用方法についてはここでは説明しません

フィルターはフィルターを定義します、ここは水が深いです


accessRules アクセスメソッドは、これらのユーザーがこのモジュールにアクセスできることを意味します

array('allow', // allow all users to perform 'index' and 'view' actions 
        'actions'=>array('index','view'), 
        'users'=>array('*'), 
      ), 

allow 表示允许访问的规则如下,deny表示拒绝访问的规则如下。
action表示规定规则使用的动作

user表示规则适用的用户群组,*表示所有用户,@表示登录后的用户,admin表示管理员用户

actionXXX 各个action函数

这里值得注意的是 这个函数

public function actionIndex() 
  { 
    if(Yii::app()->user->id != null){ 
      $dataProvider=new CActiveDataProvider( 
        'SocialRelation',  
        array('criteria'=>array('condition'=>'user_id='.Yii::app()->user->id, 
      )) 
      ); 
      $this->render('index',array( 
        'dataProvider'=>$dataProvider, 
      )); 
    } 
     
  } 

其中我们可以在dataProvider中设置相应的查询条件,注意这里设置是对于主表(A表)进行的,用的字段名也是主表中的,因为我们要显示的是当前用户的好友,于是,这里我们使用Yii::app()->user->id取得当前用户的id 。

loadModel 用于装载模型,这里我们可以看到findByPk查询了数据库。

performAjaxValidation 用于Ajax验证。

5、视图View

index.php

<&#63;php 
/* @var $this SocialRelationController */ 
/* @var $dataProvider CActiveDataProvider */ 
 
$this->breadcrumbs=array( 
  'Social Relations', 
); 
&#63;> 
 
<h1>Social Relations</h1> 
 
<&#63;php $this->widget('zii.widgets.CListView', array( 
  'dataProvider'=>$dataProvider, 
  'itemView'=>'_view', 
)); &#63;> 

我们使用一个 CListView控件进行显示,其中itemView为内容显示的具体表单,dataProvider这个是内容源,我们在controller中已经设定了。

_view.php

<&#63;php 
/* @var $this SocialRelationController */ 
/* @var $data SocialRelation */ 
&#63;> 
 
<div class="view"> 
 
  <b><&#63;php echo CHtml::encode($data->getAttributeLabel('relation_id')); &#63;>:</b> 
  <&#63;php echo CHtml::link(CHtml::encode($data->relation_id), array('view', 'id'=>$data->relation_id)); &#63;> 
  <br /> 
 
  <b><&#63;php echo CHtml::encode($data->getAttributeLabel('relation_type_id')); &#63;>:</b> 
  <&#63;php echo CHtml::encode($data->relation_type_id); &#63;> 
  <br /> 
 
  <b><&#63;php echo CHtml::encode($data->getAttributeLabel('relation_type_name')); &#63;>:</b> 
  <&#63;php  
    echo $data->relationType->relation_type_name; 
  &#63;> 
  <br /> 
   
  <b><&#63;php echo CHtml::encode($data->getAttributeLabel('user_id')); &#63;>:</b> 
  <&#63;php echo CHtml::encode($data->user_id); &#63;> 
  <br /> 
 
  <b><&#63;php echo CHtml::encode($data->getAttributeLabel('user_name')); &#63;>:</b> 
  <&#63;php  
    echo $data->user->name; 
  &#63;> 
  <br /> 
 
  <b><&#63;php echo CHtml::encode($data->getAttributeLabel('another_user_id')); &#63;>:</b> 
  <&#63;php echo CHtml::encode($data->another_user_id); &#63;> 
  <br /> 
 
  <b><&#63;php echo CHtml::encode($data->getAttributeLabel('another_user_name')); &#63;>:</b> 
  <&#63;php 
    echo $data->anotherUser->name; 
  &#63;> 
  <br /> 
   
</div> 

主要都是类似的,我们看其中的一条
复制代码 代码如下:a4b561c25d9afb9ac8dc4d70affff4194ffa136db924f78215eb2994916c495fgetAttributeLabel('relation_type_name')); ?>:0d36329ec37a2cc24d42c7229b69747a 
bdf53b1d89582f9578e1b6c0fbc1b9e9relationType->relation_type_name; ?> 
第一行为显示标签,在模型中我们设定的显示名就在这里体现出来
第二行为内容显示,这里的relationType是在模型中设置的关系名字,后面的relation_type_name是引用表的字段名(B表中的名字)

6、总结

通过上面的步骤,我们就实现了整个联合查询功能,效果图如下所示:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持帮客之家。

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/1133026.htmlTechArticleYii多表联合查询操作详解,yii联合查询详解 本文针对Yii多表联查进行汇总描述,供大家参考,具体内容如下 1、多表联查实现方法 有两种方...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。