我在“应用程序”模型中有此代码,我正在尝试获取所有相关的“广告系列”对象
public function relations()
{
return array(
'campaigns' => array(self::HAS_MANY, 'Campaign', 'appKey'),
);
}
我的问题是,广告系列表中的“appKey”字段不是应用表的主键,这就是Yii用来尝试查找广告系列的内容。
我的应用程序表的主键是'id',但我希望它使用'appKey'。如何在不将其作为主键的情况下更新我的关系方法?
感谢。
答案 0 :(得分:5)
您可以在广告系列模型中设置named scope,如下所示:
public function byApplication($appKey)
{
$this->getDbCriteria()->mergeWith(array(
'condition'=>'appKey = :appkey',
'params'=>array('appKey'=>$appKey),
));
return $this;
}
并称之为:
$campaigns = Campaign::model()->byApplication($appKey);
或者,正如Irobb所说,只需在应用程序模型中设置查询函数,而不是使用实际的关联,如下所示:
public function getCampaigns() {
return Campaign::model()->findallbyAttributes(array('appKey'=>$this->appKey));
}
并将其称为您的申请$model
上的常规关系:
$campaigns = $model->campaigns; // remember with Yii you can call getters w/o the 'get'
答案 1 :(得分:1)
一些事情...... AR主要用于将单个表建模到一个类,具有明确定义的主键...我还会使用查询构建器。
注意:AR并不是要解决所有与数据库相关的任务。这是最好的 用于在PHP构造和执行中建模数据库表 不涉及复杂SQL的查询。 Yii DAO应该用于 那些复杂的情景。
http://www.yiiframework.com/doc/guide/1.1/en/database.ar
AR依赖于明确定义的表的主键。如果表没有 有一个主键,它需要相应的AR类 通过覆盖指定哪个列应该是主键 primaryKey()方法如下,
public function primaryKey(){ 返回'id'; //对于复合主键,返回如下所示的数组 //返回数组('pk1','pk2'); }