我对Yii很陌生,对AR关系感到困惑例如,我有两个具有MANY_MANY关系的表
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;
条幅可以位于一个或多个位置,例如id为1的条幅可以放置在位置1和2,条幅2可以放置在2和3现在我想抢位置2的所有横幅,希望我现在能得到两个横幅此外,我想检查横幅字段,如果它是空的或"测试",然后得到这个横幅
在没有ORM id的简单生活中,比如这些SQL
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';
此外,我在JOIN中使用相关性名称t
,因为它是SQL构建的默认名称,这是对的吗?还是我需要使用方法来获得正确的相关性名称,以防它在某些情况下被更改?
我也尝试了关系方式
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
表只连接banner_positions(这是有条件的选择))似乎连接的条件是获得我所需要的简单干净的sql的唯一方法不管怎样,我在结果集中得到了模型。。。也许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)
当您标记此问题活动记录时,您应该使用关系活动记录。
您必须在模型中定义表之间的关系:
例如Banner
public function relations()
{
return array(
'positions'=>array(self::MANY_MANY, 'Position',
'banner_position(banner_id, position_id)'),
);
}
然后它将创建一个CCD_ 4模型中所有位置的数组。