1

Yiiフレームワークを使用しているときに、小さな問題が発生しました。
状況を説明するために:私はある種の販売促進スライダー
を作成する必要があります。各プロモーションは、プロモーションに関する詳細情報へのURLと画像のURLで構成されます。各プロモーションには、その画像のローカライズされたバージョンがいくつかあります。この目的のために、2つのデータベーステーブルを作成しました。 最初はプロモーションテーブルです。

CREATE TABLE IF NOT EXISTS `promotions` (  
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,  
  `title` varchar(100) NOT NULL,  
  `image` int(10) unsigned DEFAULT NULL,  
  `destination` varchar(200) NOT NULL,  
  `status` tinyint(3) unsigned NOT NULL DEFAULT '0',  
  PRIMARY KEY (`id`),  
  KEY `image` (`image`)  
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;  

2番目はプロモーション画像の表です。

CREATE TABLE IF NOT EXISTS `promoImages` (  
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,  
  `pid` int(10) unsigned NOT NULL,  
  `language` varchar(2) NOT NULL,  
  `url` varchar(200) NOT NULL,  
  PRIMARY KEY (`id`),  
  KEY `language` (`language`),  
  KEY `mhm` (`pid`)  
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=10 ;  

このようなデータベース構造の考え方は、フィールド画像の各プロモーションテーブル行に適切な画像の識別子が含まれ、テーブルpromoImagesの関連する列pidに一意のプロモーション識別子が含まれるというものです。各プロモーションはいくつかの未定義の言語でローカライズできるため、単一のプロモーションに関連する各画像について、promoImagesに複数の行が存在する可能性があります。この例は次のとおりです。

INSERT INTO `promoImages` (`id`, `pid`, `language`, `url`) VALUES  
(1, 1, 'lv', '/path/to/image1_lv.png'),  
(2, 2, 'lv', '/path/to/image2_lv.png'),  
(3, 3, 'lv', '/path/to/image3_lv.png'),  
(4, 1, 'en', '/path/to/image1_en.png'),  
(5, 2, 'en', '/path/to/image2_en.png'),  
(6, 3, 'en', '/path/to/image3_en.png'),  
(7, 1, 'ru', '/path/to/image1_ru.png'),  
(8, 2, 'ru', '/path/to/image2_ru.png'),  
(9, 3, 'ru', '/path/to/image3_ru.png');  

その構造を念頭に置いて、Yiiフレームワークとともに生成されたテーブルプロモーション
の外部キーも作成しました。「Gii」ツールは、このような関係を持つモデルを作成しました。 テーブルプロモーションモデルの関係

'promoImages' => array(self::HAS_MANY, 'PromoImages', 'pid'),  

およびテーブルpromoImagesモデルの関係

'p' => array(self::BELONGS_TO, 'Promotions', 'pid'),  

そして、私が知る限り、関係は正しいです。単一のプロモーションには複数のpromoImagesテーブル行を含めることができ、 promoImages行は単一のプロモーションにのみ属することができます。これは正しいと信じていますか?

問題自体について、状況を可能な限り徹底的に説明したことを願っています。
冒頭で述べたように、実際には2つの値を取得する必要があります。各テーブルから1つです。プロモーションからの宛先promoImagesからのURLですが、これらの値を選択するときは、ステータスが「1」は、プロモーションがアクティブであることを意味します。また、プロモーション画像を選択するときは、プロモーション画像の列と現在選択されているアプリケーション言語(Yii :: app()-> language)の両方に対応する行をテーブルpromoImagesから選択する必要があります。

これまでのところ、私が持っているコードは次のとおりです
。プロモーションウィジェットコントローラー

public function run() {
    $l = Yii::app()->language;
    $promos = Promotions::model()->with('promoImages')->findAll('status=:status AND promoImages.language=:language', array(
        ':status' => 1,
        ':language' => $l
    ));

    $this->render('promo', array('promotions' => $promos));
}  

プロモーションウィジェットビュー

foreach ($promotions as $promotion) {
    // $image = $promotion->promoImages->url;
    $dest = $promotion->destination;
    echo "<div class='promo_hold'>";
        echo "<a href='$dest'><img src='$image'></a>";
    echo "</div>";
}  

これにより、3つのアクティブなプロモーションに必要な3つのdivが得られますが、画像が空の場合、$ image定義のコメントを外すと、オブジェクト以外のエラーのプロパティを取得しようとしています。 Yiiのクラスリファレンスを調べましたが、これまでのところ、何の助けも得られていません。

必要な情報が不足している場合は、遠慮なくお問い合わせください。

よろしくお願いします!

PS私のテキストの壁が、答えを持っているかもしれない人々を実際に怖がらせないことを願っています:O

4

1 に答える 1

0

さて、私は自分の質問に対する答えを自分で見つけたので、他の誰かがこのような問題を抱えている場合に備えて、ここに答えとして追加します。必要なフィールドを取得するためにあらゆる種類のバリエーションを試していると、実際には単一の要素を含む配列であり、選択したプロモーションと言語に関連するすべての情報を含む オブジェクト
である ことに気付きました。$promotion->promoImages

だから私はこの問題のそのような解決策にたどり着きました、ウィジェットforeachループで私は単に設定しました:

$image = $promotion->promoImages[0]->url;

そして、それは私に正しい、言語で選択された画像アドレスを示しています。

于 2012-07-12T07:48:09.620 に答える