Yii框架,通过特定语言获取相关图像列

时间:2012-07-10 14:30:34

标签: php activerecord yii

我在使用Yii框架时遇到了一个小问题 解释情况:
我必须创建一个销售促销滑块。每个促销都包含网址以获取有关促销的更多信息以及图片网址。每个促销都有几个本地化版本的图像。为此,我创建了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 ;  

,第二个是促销图片表:

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

现在考虑到这个结构,我还在表 promotion 中创建了一个外键,它与Yii框架“Gii”工具一起生成了具有这种关系的模型:
促销模型关系

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

和表 promoImages 模型关系

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

据我所知,关系是正确的,单个升级可以有多个 promoImages 表行,任何 promoImages 行只能属于单个推广,因为我更正相信这是真的吗?

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

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

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个div我需要的3个主动促销,但是有空图像,如果我取消注释$ image定义,我得到试图获取非对象的属性错误,这是基本上我被卡住的地方,我看过Yii的课程参考,但到目前为止它还没有给我任何帮助。

如果我遗漏任何必要的信息,请不要犹豫。

事先谢谢!

P.S。我希望我的文本墙实际上不会吓跑那些可能有答案的人:O

1 个答案:

答案 0 :(得分:0)

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

所以我找到了这个问题的解决方案,在小部件 foreach 循环中我只是设置:

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

这显示了正确的语言选择图像地址。

相关问题