Настройка отношений Yii MANY_MANY - PullRequest
3 голосов
/ 23 октября 2011

Я пытаюсь установить отношение MANY_MANY в Yii с использованием Active Record.

У меня есть три таблицы

profile_id profile_description

category_id category_name

profile_category profile_id category_id

Мои модели - Профиль, Категорияи ProfileCategory.

Я пытаюсь выполнить запрос с помощью category_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(
        'profiles'=>array(
            self::MANY_MANY,
            'Profile',
            'profile_category(category_id, profile_id)',
        ),
        'profile_category'=>array(
            self::HAS_MANY,
            'ProfileCategory',
            'category_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(
    'categories'=>array(
            self::MANY_MANY,
            'Category',
            'profile_category(profile_id, category_id)'
        ),
        'profileCategory'=>array(
            self::HAS_MANY,
            'ProfileCategory',
            'profile_id'
        ),
   );
}

ProfileCategory Модель

public function relations()
{
    return array(
        'category'=>array(
            self::BELONGS_TO,
            'Category',
            'category_id',
        ),
        'profile'=>array(
            self::BELONGS_TO,
            'Profile',
            'profile_id',
        ),
    );
}

Контроллер

public function actionResults()
{   
    $category=$_POST['terms'];
    $dataProvider=new CActiveDataProvider(
        'Profile',
        array(
            'criteria'=>array(
                'with'=>array('profile_category'),
                'condition'=>'display=10 AND profile_category.category_id=1',
                'order'=>'t.id DESC',
                'together'=>true,
            ),
        )
    );
    $this->render('results',array(
        'dataProvider'=>$dataProvider,
    ));
}

Вид

<div id=resultsleft>
<?php
foreach($dataProvider as $value)
{
echo $value->profile_id;
}
?>
</div>

Какие-нибудь мысли?Благодарю вас!Ничто не показывает в представлении.

Ответы [ 2 ]

2 голосов
/ 16 апреля 2013

Для логического идентификатора было бы лучше сначала связать модель с моделью ...

Пример доступен здесь .

Категория модели

' Профиль ', 'profile_category ( profile_id , ...)'

public function relations()
{
    return array(
        'profiles'=>array(
            self::MANY_MANY,
            'Profile',
            'profile_category(profile_id, category_id)'
        ),
        'profile_category'=>array(
            self::HAS_MANY,
            'ProfileCategory',
            'category_id',
        ),
    );
}

Профильная модель

' Категория ', 'profile_category ( category_id , ...)'

public function relations()
{
    return array(
        'categories'=>array(
            self::MANY_MANY,
            'Category',
            'profile_category(category_id, profile_id)'
        ),
        'profile_category'=>array(
            self::HAS_MANY,
            'ProfileCategory',
            'profile_id'
        ),
    );
}

Это актуально, если модель базы данных имеет
много self :: BELONGS_TO и база данных имеет только PK (PrimaryKeys)

такой код будет правильно выполнен

print_r(Profile::model()->findByPk(5)->categories);
print_r(Category::model()->findByPk(8)->profiles);
2 голосов
/ 24 октября 2011

Вам необходимо настроить свойство с именем profileCategory (не profile_category ) в модели профиля:

    'profileCategory'=>array(
        self::HAS_MANY,
        'ProfileCategory',
        'profile_id'
    ),

Вы можете использовать его с и условие следующее:

       'criteria'=>array(
            'with'=>array('profileCategory'),
            'condition'=>'display=10 AND profileCategory.category_id=1',
            'order'=>'t.id DESC',
            'together'=>true,
        ),
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...