James Zaghini
James Zaghini

Reputation: 4011

Yii CActiveRecord: find related data, but not using the primary key

I have this code in my model for "Application", I'm trying to get all the related "Campaign" objects

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

My problem is, the 'appKey' field in the campaigns table is not the primary key of the applications table and this is what Yii is using to try and find the campaigns.

The primary key of my applications table is 'id' but I would like it to use 'appKey'. How can I update my relations method to do this without making it the primary key?

Thanks.

Upvotes: 3

Views: 2803

Answers (2)

thaddeusmt
thaddeusmt

Reputation: 15600

You could set up a named scope in the Campaign model, like so:

public function byApplication($appKey)
{
    $this->getDbCriteria()->mergeWith(array(
        'condition'=>'appKey = :appkey',
        'params'=>array('appKey'=>$appKey),
    ));
    return $this;
}

And call it like this:

$campaigns = Campaign::model()->byApplication($appKey);

Or, as Irobb said, just set up a query function in your Application model instead of using an actual Relation, like so:

public function getCampaigns() {
    return Campaign::model()->findallbyAttributes(array('appKey'=>$this->appKey));
}

And call it like a regular relation on your Application $model:

$campaigns = $model->campaigns; // remember with Yii you can call getters w/o the 'get'

Upvotes: 5

user799490
user799490

Reputation:

A couple of things... AR is primarily useful for modeling a single table to a class, with a well-defined primary key... Anything else I would use the query builder.

Note: AR is not meant to solve all database-related tasks. It is best used for modeling database tables in PHP constructs and performing queries that do not involve complex SQLs. Yii DAO should be used for those complex scenarios.

http://www.yiiframework.com/doc/guide/1.1/en/database.ar

AR relies on well defined primary keys of tables. If a table does not have a primary key, it is required that the corresponding AR class specify which column(s) should be the primary key by overriding the primaryKey() method as follows,

public function primaryKey() { return 'id'; // For composite primary key, return an array like the following // return array('pk1', 'pk2'); }

Upvotes: 1

Related Questions