Yii CActiveRecord: найти связанные данные, но не используя первичный ключ

У меня есть этот код в моей модели для "Приложения", я пытаюсь получить все связанные объекты "Кампании"

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

Моя проблема в том, что поле appKey в таблице кампаний не является первичным ключом таблицы приложений, и это то, что Yii использует для поиска кампаний.

Первичным ключом моей таблицы приложений является 'id', но я бы хотел, чтобы он использовал 'appKey'. Как я могу обновить свой метод отношений, чтобы сделать это, не делая его первичным ключом?

Благодарю.

2 ответа

Решение

Вы можете настроить именованную область в модели Campaign, например так:

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'

Пара вещей... AR в первую очередь полезен для моделирования одной таблицы в классе с четко определенным первичным ключом... Во всем остальном я бы использовал построитель запросов.

Примечание: AR не предназначен для решения всех задач, связанных с базой данных. Лучше всего его использовать для моделирования таблиц базы данных в конструкциях PHP и выполнения запросов, не связанных со сложными SQL. Yii DAO следует использовать для этих сложных сценариев.

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

AR опирается на четко определенные первичные ключи таблиц. Если таблица не имеет первичного ключа, требуется, чтобы соответствующий класс AR указал, какие столбцы должны быть первичным ключом, переопределив метод primaryKey() следующим образом:

public function primaryKey() { return 'id'; // Для составного первичного ключа возвращаем массив, подобный следующему // return array('pk1', 'pk2'); }

Другие вопросы по тегам