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