0

Yii を初めて使用し、AR リレーションについて混乱しています。たとえば、MANY_MANY リレーションを持つ 2 つのテーブルがあります。

CREATE TABLE `banner` (
  `banner_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `banner_action` varchar(255) DEFAULT NULL,
  ...
  PRIMARY KEY (`banner_id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

CREATE TABLE `position` (
  `position_id` tinyint(3) unsigned NOT NULL AUTO_INCREMENT,
  `position_name` varchar(64) NOT NULL,
  PRIMARY KEY (`position_id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

CREATE TABLE `banner_position` (
  `banner_id` int(11) NOT NULL,
  `position_id` tinyint(4) NOT NULL,
  PRIMARY KEY (`banner_id`,`position_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

バナーは 1 つまたは複数の位置に配置できます。たとえば、ID 1 のバナーは位置 1 と 2 に配置でき、バナー 2 は位置 2 と 3 に配置できます。ここで、位置 2 のすべてのバナーを取得したいのですが、両方のバナーを取得できると予想されます。また、バナーフィールドを確認したいのですが、空または「テスト」の場合は、このバナーを取得します

これらのSQLのようなORM idのない単純な生活の中で

SELECT b.banner_id FROM banner b
INNER JOIN banner_position bp ON bp.banner_id = b.banner_id AND bp.position_id = 2
WHERE (b.banner_action = 'test' OR b.banner_action IS NULL)

Yii ではどうすればいいのか理解できません

banner_action の基準を書きました

$select = new CDbCriteria;
$select->addCondition(array('banner_action = "test" OR banner_action IS NULL'));

モデルを使用して結果を得る

$banner = BannerModel::model()->find($select);

$model->with(???) を使用するか、JOIN を基準に追加する必要がありますか?

$select->join = 'INNER JOIN banner_position bp ON bp.position_id = 2 AND bp.banner_id = t.banner_id';

またt、SQL構築のデフォルトであるため、JOINで相関名を使用しますか、これは正しいですか、それとも状況によって変更された場合に正しい相関名を取得するためにメソッドを使用する必要がありますか?

私も関係方法を試します

public function relations()
{
    return array(
        'positions' => array(self::MANY_MANY, 'PositionModel',
            'banner_position(banner_id, position_id)')
    );
}

そして、この選択(banner_action = 'test'またはbanner_actionがnullのような基準を追加する方法がわかりません)

$banner = BannerModel::model()
                ->with('positions')
                ->find('positions.position_id = 2');

そして、Yii ビルド SQL は私が期待したようには見えません (私は INNER JOIN が必要で、positionsテーブルを結合する必要はありません (これは条件付き選択です))。とにかく結果セットのモデル... Yiiには条件付き関係を処理する方法がないのでしょうか?

SELECT `t`.`banner_id` AS `t0_c0`, `t`.`banner_type` AS `t0_c1`, `t`.`banner_content` AS `t0_c2`, `t`.`banner_target` AS `t0_c3`, `t`.`banner_controller` AS `t0_c4`, `t`.`banner_action` AS `t0_c5`, `t`.`banner_param_type` AS `t0_c6`, `t`.`banner_param_direction` AS `t0_c7`, `t`.`banner_param_kind` AS `t0_c8`, `positions`.`position_id` AS `t1_c0`, `positions`.`position_name` AS `t1_c1` FROM `banner` 
`t`  LEFT OUTER JOIN `banner_position` `positions_positions` ON (`t`.`banner_id`=`positions_positions`.`banner_id`) 
LEFT OUTER JOIN `position` `positions` ON (`positions`.`position_id`=`positions_positions`.`position_id`)  
WHERE (positions.position_id = 2)
4

1 に答える 1

0

この質問のアクティブ レコードにタグを付けたので、リレーショナル Active Recordsを使用する必要があります。

モデル内のテーブル間の関係を定義する必要があります。

たとえばBanner

public function relations()
{
    return array(
        'positions'=>array(self::MANY_MANY, 'Position',
            'banner_position(banner_id, position_id)'),
    );
}

次に、モデル内のすべての位置の配列を作成しますBanner

于 2013-02-21T12:19:24.017 に答える