Yii CActiveRecord: найти связанные данные, но не используя первичный ключ - PullRequest
3 голосов
/ 06 октября 2011

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

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

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

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

Спасибо.

Ответы [ 2 ]

5 голосов
/ 11 октября 2011

Вы можете установить именованную область действия в модели 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'
1 голос
/ 06 октября 2011

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

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

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

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

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

...