Сложная связь в модели (relations)

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
Аватара пользователя
PendalF
Сообщения: 130
Зарегистрирован: 2013.10.22, 19:20
Контактная информация:

Сложная связь в модели (relations)

Сообщение PendalF »

Как можно составить relation для модели Bank с учётом такой структуры таблиц? (см. картинку)
Изображение
Требуется получить все регионы конкретного банка.
Чтобы можно было набрать $model->regions и получить все регионы.
Весь вечер пытался прописать такую relation, у меня не получилось.
SQL-запрос выглядит вот так:

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

SELECT DISTINCT region.name 
FROM bank, product, region, regions
WHERE bank.id=product.bank_id
AND product.id=regions.product_id
AND region.id=regions.region_id
AND bank.name='Название банка' 
Аватара пользователя
PendalF
Сообщения: 130
Зарегистрирован: 2013.10.22, 19:20
Контактная информация:

Re: Сложная связь в модели (relations)

Сообщение PendalF »

Да я читал это, думал над двумя вариантами:
1 вариант.

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

'Regions'=>array(
    'self::HAS_MANY',
    'Region',
   // Дальше что?... Не понятно как FK здесь указывать
) 
2 вариант.

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

'Regions'=>array(
    'self::HAS_MANY',
    'Product',
    'bank_id',
    'with'=>'regions',
    'on'=>//тут бы написать что-то вроде regions.product_id=product.id AND regions.region_id=region.id но это не сработает
) 
Аватара пользователя
sluchainiyznak
Сообщения: 617
Зарегистрирован: 2013.05.19, 17:51
Откуда: ХМАО-Югра, г. Сургут
Контактная информация:

Re: Сложная связь в модели (relations)

Сообщение sluchainiyznak »

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

class Bank extends CActiveRecord
{
    public function relations()
    {
        return array(
            'products'=>array(self::HAS_MANY, 'Product', 'Bank_id'),
            );
    }
}

class Product extends CActiveRecord
{
    public function relations()
    {
        return array(
            'bank'=>array(self::BELONGS_TO, 'Bank', 'Bank_id'),
            'regions'=>array(self::MANY_MANY, 'Region', 'tbl_regions(product_id, region_id)'),
            );
    }
}

class Region extends CActiveRecord
{
    public function relations()
    {
        return array(
            'products'=>array(self::MANY_MANY, 'Product', 'tbl_regions(region_id, product_id)'),
            );
    }
} 
Аватара пользователя
PendalF
Сообщения: 130
Зарегистрирован: 2013.10.22, 19:20
Контактная информация:

Re: Сложная связь в модели (relations)

Сообщение PendalF »

sluchainiyznak писал(а):

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

class Bank extends CActiveRecord
{
    public function relations()
    {
        return array(
            'products'=>array(self::HAS_MANY, 'Product', 'Bank_id'),
            );
    }
}

class Product extends CActiveRecord
{
    public function relations()
    {
        return array(
            'bank'=>array(self::BELONGS_TO, 'Bank', 'Bank_id'),
            'regions'=>array(self::MANY_MANY, 'Region', 'tbl_regions(product_id, region_id)'),
            );
    }
}

class Region extends CActiveRecord
{
    public function relations()
    {
        return array(
            'products'=>array(self::MANY_MANY, 'Product', 'tbl_regions(region_id, product_id)'),
            );
    }
}

Эти связи у меня прописаны, но к сожалению с ними не получится сделать так:

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

$model = new Bank();
...
$model->regions; 
Всё равно спасибо за ваш ответ!
Аватара пользователя
sluchainiyznak
Сообщения: 617
Зарегистрирован: 2013.05.19, 17:51
Откуда: ХМАО-Югра, г. Сургут
Контактная информация:

Re: Сложная связь в модели (relations)

Сообщение sluchainiyznak »

Вы удивляетесь тому что в данном случае $model->regions постой?

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

$model = new Bank();
...
$model->regions;
В таком случае сразу вопрос, а с "какого ..." он должен быть чем то заполнен, если модель новая ( "= new Bank()" )?
Аватара пользователя
PendalF
Сообщения: 130
Зарегистрирован: 2013.10.22, 19:20
Контактная информация:

Re: Сложная связь в модели (relations)

Сообщение PendalF »

sluchainiyznak писал(а):Вы удивляетесь тому что в данном случае $model->regions постой?

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

$model = new Bank();
...
$model->regions; 
В таком случае сразу вопрос, а с "какого ..." он должен быть чем то заполнен, если модель новая ( "= new Bank()" )?

Я ведь не спроста поставил "...". Но вы правы, чтобы не путать людей, правильно было бы написать так:

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

$model = Bank::model()->findByPk(1);
$model->regions;
 
lancedevnull
Сообщения: 1268
Зарегистрирован: 2013.07.17, 17:37

Re: Сложная связь в модели (relations)

Сообщение lancedevnull »

$bank->products[0]->regions
Аватара пользователя
PendalF
Сообщения: 130
Зарегистрирован: 2013.10.22, 19:20
Контактная информация:

Re: Сложная связь в модели (relations)

Сообщение PendalF »

lancedevnull писал(а):$bank->products[0]->regions
Это даст регионы для какого-то одного продукта, а нужно получить все уникальные регионы для одного банка.
Пока что сделал вот такой метод, но это костыль

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

public function regions()
    {
        $array = array();
        foreach ( $this->products as $product )
            foreach ( $product->regions as $region )
                if ( !in_array($region, $array) )
                    $array[] = $region;
        
        return $array;
    } 
Ответить