Relation не по primary key

Обсуждение документации. Переводы Cookbook и авторские рецепты.
Аватара пользователя
greatdane
Сообщения: 408
Зарегистрирован: 2010.10.20, 14:05
Откуда: Электросталь
Контактная информация:

Relation не по primary key

Сообщение greatdane »

Как правильно прописать relation (и возможно ли), если в обеих таблицах поля, в которых хранится связь - не primary?

http://yiiframework.ru/doc/cookbook/ru/ ... k.relation
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Relation не по primary key

Сообщение samdark »

Прописывается ровно так же.
Аватара пользователя
greatdane
Сообщения: 408
Зарегистрирован: 2010.10.20, 14:05
Откуда: Электросталь
Контактная информация:

Re: Relation не по primary key

Сообщение greatdane »

Я попробовала так же - не работает.

Вот фрагменты моделей:

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

<?php
class Dogs extends CActiveRecord
{
    //...
    public function relations()
    {
        return array(
           // ... тут еще relations
            'showsdog'=>array(self::HAS_MANY, 'DogsShow', 'sh_dog_name_eng'),
        );
    }

    /**
     * @return array customized attribute labels (name=>label)
     */
    public function attributeLabels()
    {
        return array(
            'dog_id' => 'Dog', // это primary key
            // ... тут еще атрибуты ...
            'name_eng' => 'Dog Name',
            // ... тут еще атрибуты ...
        );
    }
//...
}
 

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

<?php
class DogsShow extends CActiveRecord
{
    //...

    public function relations()
    {
        return array(
            'showsdog'=>array(self::BELONGS_TO, 'Dogs', 'name_eng'),
        );
    }

    /**
     * @return array customized attribute labels (name=>label)
     */
    public function attributeLabels()
    {
        return array(
            'sh_dog_id' => 'Show Dog', // это primary key
            //... тут еще атрибуты
            'sh_dog_name_eng' => 'Dog Name',
            // ... тут еще атрибуты
        );
    }

    //...
}
 
В контроллере выборка:

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

$criteria = new CDbCriteria;
        $criteria->with = array(
            // тут еще with, которые работают нормально
            'showsdog',
        );
        $model = Dogs::model()->findByPk((int)$id,$criteria);
 
Во view пишу

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

<?php
var_dump($model->showsdog);
?>
Выводится array(0) { }

Что неправильно?
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Relation не по primary key

Сообщение samdark »

А запрос какой генерируется?
Аватара пользователя
greatdane
Сообщения: 408
Зарегистрирован: 2010.10.20, 14:05
Откуда: Электросталь
Контактная информация:

Re: Relation не по primary key

Сообщение greatdane »

Не буду весь огромный запрос приводить, вот важная часть:

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

  LEFT OUTER JOIN
`dogs_show` `showsdog` ON (`showsdog`.`sh_dog_name_eng`=`t`.`dog_id`) 
Т.е. соотносится все равно с первичным ключом
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Relation не по primary key

Сообщение samdark »

InnoDB? Внешние ключи расставлены как надо?
Аватара пользователя
greatdane
Сообщения: 408
Зарегистрирован: 2010.10.20, 14:05
Откуда: Электросталь
Контактная информация:

Re: Relation не по primary key

Сообщение greatdane »

Нет, MyISAM.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Relation не по primary key

Сообщение samdark »

Аватара пользователя
greatdane
Сообщения: 408
Зарегистрирован: 2010.10.20, 14:05
Откуда: Электросталь
Контактная информация:

Re: Relation не по primary key

Сообщение greatdane »

Спасибо огромное! Работает!
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Relation не по primary key

Сообщение samdark »

SpiLLeR
Сообщения: 350
Зарегистрирован: 2009.09.17, 16:47
Откуда: Санкт-Петербург
Контактная информация:

Re: Relation не по primary key

Сообщение SpiLLeR »

Взял на заметку, я делал так http://devkp.ru/post/otnosheniya-svyaz- ... mu-klyuchu
Предупрежден - значит вооружен.
devKP.ru
Аватара пользователя
creocoder
Сообщения: 138
Зарегистрирован: 2010.01.24, 05:29
Откуда: Тамбов

Re: Relation не по primary key

Сообщение creocoder »

Теперь можно решать этот вопрос без костылей. Версия в svn на текущий момент позволяет сделать так:

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

'roles'=>array(self::HAS_ONE, 'Role',array('some_field'=>'id'))
  
Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: Relation не по primary key

Сообщение Ekstazi »

О, круто, твое поведение тоже понимает это ?
Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: Relation не по primary key

Сообщение Ekstazi »

А если ключ составной ?
Аватара пользователя
creocoder
Сообщения: 138
Зарегистрирован: 2010.01.24, 05:29
Откуда: Тамбов

Re: Relation не по primary key

Сообщение creocoder »

Ekstazi писал(а):О, круто, твое поведение тоже понимает это ?
WithRelatedBehavior в процессе доработки под эту фичу.
Ekstazi писал(а):А если ключ составной ?
Если составной, то FK задается как array('fk_c1'=>'pk_c1','fk_c2'=>'pk_c2');
Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: Relation не по primary key

Сообщение Ekstazi »

Ок, спс. Ждем!
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Relation не по primary key

Сообщение samdark »

В документации в SVN это описано. С релизом будет на сайте.
SpiLLeR
Сообщения: 350
Зарегистрирован: 2009.09.17, 16:47
Откуда: Санкт-Петербург
Контактная информация:

Re: Relation не по primary key

Сообщение SpiLLeR »

Раз такое дело, а когда можно ждать 1.9? и туда уже будет включен withRelated? ^_^
Предупрежден - значит вооружен.
devKP.ru
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Relation не по primary key

Сообщение samdark »

withRelated ещё нужно немного погонять, так что пока не ясно, будет он в 1.1.9 или нет и в каком виде. Когда ждать не знаю. Фиксов уже прилично накопилось, может и поскорее выпустим.
Аватара пользователя
solo
Сообщения: 320
Зарегистрирован: 2013.03.08, 19:59
Откуда: Ukraine, VINNITSA

Re: Relation не по primary key

Сообщение solo »

Мне кажется что лучше эта связь указывалась как в Kohana через public function relations(){}.
Меньше было бы телодвижений.
Ответить