Yii CActiveRecord:查找相关数据,但不使用主键

时间:2011-10-06 03:12:22

标签: yii entity-relationship

我在“应用程序”模型中有此代码,我正在尝试获取所有相关的“广告系列”对象

public function relations()
{
    return array(
        'campaigns' => array(self::HAS_MANY, 'Campaign', 'appKey'),
    );
}

我的问题是,广告系列表中的“appKey”字段不是应用表的主键,这就是Yii用来尝试查找广告系列的内容。

我的应用程序表的主键是'id',但我希望它使用'appKey'。如何在不将其作为主键的情况下更新我的关系方法?

感谢。

2 个答案:

答案 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'); }