Реляционная AR - through

Добрый день, господа.

Есть таблицы.




CREATE TABLE `currency` (

  `id` smallint(5) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID записи',

  `name` varchar(100) NOT NULL COMMENT 'Наименование валюты (может быть любым. Уникально)',

  `ISOChar` varchar(3) DEFAULT NULL COMMENT 'Трёхбуквенный алфавитный (alfa-3) код валюты (ISO)',

  `ISONum` varchar(3) DEFAULT NULL COMMENT 'Трёхзначный цифровой (number-3) код валюты (ISO)',

  `base` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT 'Признак базовой валюты. Базовая валюта может быть только 1. Проверка на уровне php.',

  PRIMARY KEY (`id`),

  UNIQUE KEY `name` (`name`),

  UNIQUE KEY `ISOChar` (`ISOChar`),

  UNIQUE KEY `ISONum` (`ISONum`)

) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='Валюты';




CREATE TABLE `currency_rate` (

  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID записи',

  `parentId` smallint(5) unsigned NOT NULL COMMENT 'ID валюты, по отношению к котрой выставляется курс',

  `rate` decimal(10,2) unsigned NOT NULL COMMENT 'Курс',

  `currencyId` smallint(5) unsigned NOT NULL COMMENT 'ID валюты, которая в данном случае выступает валютой',

  `unit` decimal(10,2) unsigned NOT NULL COMMENT 'Количество единиц валюты, за которое дают rate',

  `date` datetime NOT NULL COMMENT 'Дата курса',

  PRIMARY KEY (`id`),

  KEY `parentId` (`parentId`,`currencyId`,`date`),

  KEY `currencyId` (`currencyId`),

  KEY `date` (`date`)

) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='Курсы валют';




CREATE TABLE `request` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `number` int(10) NOT NULL COMMENT 'Номер заявки',

  `date` date DEFAULT NULL COMMENT 'Дата заявки',

  `buyer` int(11) NOT NULL COMMENT 'Покупатель (ссылка на таблицу клиентов)',

  `buyer_name` varchar(255) NOT NULL,

  `base_cost` decimal(10,2) DEFAULT NULL COMMENT 'Базовая стоимость',

  `currency_rate` bigint(20) unsigned NOT NULL COMMENT 'Курс валюты',

  `discount` decimal(5,2) DEFAULT NULL COMMENT 'Скидка, %',

  `comment` text NOT NULL COMMENT 'Комментарий',

  `org` varchar(255) DEFAULT NULL COMMENT 'Организация',

  `officer` int(11) NOT NULL COMMENT 'Ответственный (ссылка на таблицу users)',

  `officer_name` varchar(128) NOT NULL COMMENT 'Имя ответственного пользователя',

  `program` text COMMENT 'Программа',

  `blocked` tinyint(1) unsigned zerofill NOT NULL DEFAULT '0' COMMENT 'Заюлокирована (0-нет, 1-да)',

  `archived` tinyint(1) unsigned zerofill NOT NULL DEFAULT '0' COMMENT 'Архивная (0-нет, 1-да)',

  `pay_status` tinyint(1) unsigned zerofill NOT NULL DEFAULT '0' COMMENT 'Статус оплаты (0-нет, 1-да)',

  `pay_date` date DEFAULT NULL COMMENT 'Дата предполгаемой оплаты',

  `non_cash` tinyint(1) unsigned zerofill NOT NULL DEFAULT '0' COMMENT 'Безналичный расчет (0-нет, 1-да)',

  PRIMARY KEY (`id`),

  UNIQUE KEY `number` (`number`),

  KEY `date` (`date`,`buyer`,`officer`,`blocked`,`archived`,`pay_status`,`pay_date`,`non_cash`),

  KEY `buyer` (`buyer`,`officer`),

  KEY `officer` (`officer`),

  KEY `officer_name` (`officer_name`),

  KEY `buyer_name` (`buyer_name`),

  KEY `currency_rate` (`currency_rate`)

) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='Заказы';



Значит в таблице заказов хранится id курса валюты. В курсах валют хранится id базовой валюты и id валюты, по отношению к которой выставляется курс.

Мне нужно вывести курс валюты, т.е., получить курс, по id, и вывести наименование базовой валюты и валюты, по отношению к которой выставлен курс.

Вот оиписание связей.




	public function relations() {

		// NOTE: you may need to adjust the relation name and the related

		// class name for the relations automatically generated below.

		return array(

			'officer0' => array(self::BELONGS_TO, 'User', 'officer'),

			'buyer0' => array(self::BELONGS_TO, 'Clients', 'buyer'),

			'currency_rate0' => array(self::BELONGS_TO, 'CurrencyRate', 'currency_rate'),

			'currency_pid' => array(self::HAS_MANY, 'Currency', array('parentId'=>'id'), 'through'=>'currency_rate0'),

			'currency_cid' => array(self::HAS_MANY, 'Currency', array('currencyId'=>'id'), 'through'=>'currency_rate0'),

		);

	}




Первые две связи добавлены при генерации модели, остальные я добавлял сам.

Собственно получить название валюты для parentId у меня получилось. А для currencyId не получается.

Запрос выдает ошибку Not unique table/alias: ‘currency_rate0’.

Ну это понятно.

Но как быть в моем случае? Как можно вытянуть оба имени?

Я понимаю, что эти сложности у меня возникли скорее всего из-за неправильной стрктуры БД. Собственно, за совет как было правильнее хранить такие данные, буду благодарен.

Вопрос снят. Изменил структуру таблицы курсов валют.