1

我在使用 Yii 框架时遇到了一个小问题。
为了解释这种情况:
我必须创建一个销售促销滑块。每个促销活动都包含一个指向有关促销活动的更多信息的url和一个图像 url。每个促销都有其图像的多个本地化版本。为此,我创建了 2 个数据库表 -
首先是 Promotions 表:

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 ;  

第二个是促销图片表:

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'),  

和 table promoImages模型关系

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

据我所知,关系是正确的,单个促销可以有多个promoImages表行,并且任何promoImages行只能属于单个促销,因为我正确地相信这是真的?

我希望我已经尽可能彻底地解释了情况,现在谈谈问题本身。
正如我在顶部提到的那样,我真的只需要从每个表中检索 2 个值,1 个:来自promotions的destination和来自promoImages的url ,但是当我选择这些值时,我需要记住只选择那些状态为为“1”,表示促销活动。此外,在选择促销图片时,我需要从promoImages表中选择对应于促销图片列以及当前选择的应用程序语言(Yii::app()->language)的行。

到目前为止,我的代码如下:
促销小部件控制器

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 定义,我会得到Trying to get property of non-object错误,这基本上是我被卡住的地方,我已经查看了 Yii 的课程参考,但到目前为止它还没有给我任何帮助。

如果我缺少任何必需的信息,请随时询问。

预先感谢!

PS我希望我的文字墙实际上不会吓跑可能有答案的人:O

4

1 回答 1

0

好的,所以我自己找到了我的问题的答案,所以我会在这里添加它作为答案,以防其他人遇到这样的问题。
在尝试各种变体来获取我需要的字段时,我注意到它$promotion->promoImages实际上是一个包含单个元素的数组,该对象包含与所选促销和语言相关的所有信息。

所以我为这个问题找到了这样的解决方案,在我简单地设置的小部件foreach循环中:

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

这向我展示了正确的、语言选择的图像地址。

于 2012-07-12T07:48:09.620 回答