我在使用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
答案 0 :(得分:0)
好的,所以我自己找到了问题的答案,所以我会在这里添加它作为答案,以防其他人有这样的问题。
在尝试各种变体来获取我需要的字段时,我注意到$promotion->promoImages
实际上是包含单个元素的数组,对象包含所有相关信息选择推广和语言。
所以我找到了这个问题的解决方案,在小部件 foreach 循环中我只是设置:
$image = $promotion->promoImages[0]->url;
这显示了正确的语言选择图像地址。