Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何从Yii中的模型中选择对象取决于关系表_Php_Activerecord_Yii - Fatal编程技术网

Php 如何从Yii中的模型中选择对象取决于关系表

Php 如何从Yii中的模型中选择对象取决于关系表,php,activerecord,yii,Php,Activerecord,Yii,我是Yii的新手,对AR关系感到困惑 例如,我有两个具有多个关系的表 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;

我是Yii的新手,对AR关系感到困惑 例如,我有两个具有多个关系的表

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_行动编写了标准

$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\u action='test'或banner\u action是空的)

而且Yii build SQL与我预期的不一样(我需要内部连接,也不需要
位置
仅表连接横幅位置(这是条件选择)) 而且,带连接的条件似乎是获得我所需要的简单而干净的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)

当您标记此问题活动记录时,您应该使用

您必须在模型中定义表之间的关系:

例如
横幅

public function relations()
{
    return array(
        'positions'=>array(self::MANY_MANY, 'Position',
            'banner_position(banner_id, position_id)'),
    );
}

然后,它将创建一个包含您的
横幅
模型中所有位置的数组。

您是否尝试过yii支持的关系?@dInGd0nG我更改的问题添加了其他信息,请检查itI更改的问题以处理您的想法,如果您感兴趣,请检查新文本
public function relations()
{
    return array(
        'positions'=>array(self::MANY_MANY, 'Position',
            'banner_position(banner_id, position_id)'),
    );
}