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

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
madmis
Сообщения: 17
Зарегистрирован: 2012.02.23, 15:29

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

Сообщение madmis »

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

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

Код: Выделить всё

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'.
Ну это понятно.

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

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

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

Сообщение madmis »

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