この記事は参考のために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 つのタイプの関係を提供します。
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つの参照テーブルを生成します
ユーザーテーブル: AccessUser.php
リーリー4.コントローラー
3 つのテーブルを導入した後、同様に、Gii を使用してメイン テーブル (テーブル A) の CRUD を生成し、それにいくつかの変更を加えるだけです。コードは次のとおりです。
SocialRelationController.php
リーリー
各関数と変数の簡単な紹介
フィルターはフィルターを定義します、ここは水が深いです
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
<?php /* @var $this SocialRelationController */ /* @var $dataProvider CActiveDataProvider */ $this->breadcrumbs=array( 'Social Relations', ); ?> <h1>Social Relations</h1> <?php $this->widget('zii.widgets.CListView', array( 'dataProvider'=>$dataProvider, 'itemView'=>'_view', )); ?>
我们使用一个 CListView控件进行显示,其中itemView为内容显示的具体表单,dataProvider这个是内容源,我们在controller中已经设定了。
_view.php
<?php /* @var $this SocialRelationController */ /* @var $data SocialRelation */ ?> <div class="view"> <b><?php echo CHtml::encode($data->getAttributeLabel('relation_id')); ?>:</b> <?php echo CHtml::link(CHtml::encode($data->relation_id), array('view', 'id'=>$data->relation_id)); ?> <br /> <b><?php echo CHtml::encode($data->getAttributeLabel('relation_type_id')); ?>:</b> <?php echo CHtml::encode($data->relation_type_id); ?> <br /> <b><?php echo CHtml::encode($data->getAttributeLabel('relation_type_name')); ?>:</b> <?php echo $data->relationType->relation_type_name; ?> <br /> <b><?php echo CHtml::encode($data->getAttributeLabel('user_id')); ?>:</b> <?php echo CHtml::encode($data->user_id); ?> <br /> <b><?php echo CHtml::encode($data->getAttributeLabel('user_name')); ?>:</b> <?php echo $data->user->name; ?> <br /> <b><?php echo CHtml::encode($data->getAttributeLabel('another_user_id')); ?>:</b> <?php echo CHtml::encode($data->another_user_id); ?> <br /> <b><?php echo CHtml::encode($data->getAttributeLabel('another_user_name')); ?>:</b> <?php echo $data->anotherUser->name; ?> <br /> </div>
主要都是类似的,我们看其中的一条
复制代码 代码如下:<?php echo CHtml::encode($data->getAttributeLabel('relation_type_name')); ?>:
<?php echo $data->relationType->relation_type_name; ?>
第一行为显示标签,在模型中我们设定的显示名就在这里体现出来
第二行为内容显示,这里的relationType是在模型中设置的关系名字,后面的relation_type_name是引用表的字段名(B表中的名字)
6、总结
通过上面的步骤,我们就实现了整个联合查询功能,效果图如下所示:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持帮客之家。