Вопрос по связям :)

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

Вопрос по связям :)

Сообщение AIR »

Добрый день уважаемые программисты и знатоки Yii :)
Я, наверное неделю уже мучаюсь со связями (relations) в Yii фреймворке и всё никак не получается.
Итак вопросы:
1) Нужно ли в самой базе указывать ключи и связи, чтобы потом реализовать их на YII и они заработали?
2) Как получить доступ к связи из view. (Я так понимаю, что через: имя_модели->название_связи. Название связи должно становиться свойством модели? Если да, то у меня, почему-то не становится и доступ к связи из модели, я получить не могу).

Заранее благодарен за ответы. Если добавите какие то примерчики наглядные, будет вообще хорошо. :)
Простите за нубство, я только изучаю :)
masson
Сообщения: 545
Зарегистрирован: 2012.07.03, 15:59

Re: Вопрос по связям :)

Сообщение masson »

AIR писал(а):1) Нужно ли в самой базе указывать ключи и связи, чтобы потом реализовать их на YII и они заработали?
Если имеются в виду MySQL-relations - то необязательно. Достаточно просто проиндексировать по связываемым полям.
AIR писал(а):2) Как получить доступ к связи из view. (Я так понимаю, что через: имя_модели->название_связи. Название связи должно становиться свойством модели? Если да, то у меня, почему-то не становится и доступ к связи из модели, я получить не могу).
Потому что надо имя_модели->название_связи->имя_поля_в_связываемой_таблице. А просто имя_модели->название_связи - это объект.
AIR
Сообщения: 28
Зарегистрирован: 2014.10.31, 17:35

Re: Вопрос по связям :)

Сообщение AIR »

masson писал(а):
AIR писал(а):1) Нужно ли в самой базе указывать ключи и связи, чтобы потом реализовать их на YII и они заработали?
Если имеются в виду MySQL-relations - то необязательно. Достаточно просто проиндексировать по связываемым полям.
AIR писал(а):2) Как получить доступ к связи из view. (Я так понимаю, что через: имя_модели->название_связи. Название связи должно становиться свойством модели? Если да, то у меня, почему-то не становится и доступ к связи из модели, я получить не могу).
Потому что надо имя_модели->название_связи->имя_поля_в_связываемой_таблице. А просто имя_модели->название_связи - это объект.

Код модели метода relations()

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

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(
            'category' => array(self::BELONGS_TO, 'Category', 'category_id'),
        );
    } 
Далее мне во view в виджете нужно получить доступ к связи 'category' чтобы подставить категорию страницы из базы.
IDE стал подсвечивать 'category' при вызове из модели, только после того, как я задал ключи в базе и связал поля там же и сгенерировал новую модель через gii.
Но доступ всё равно не получаю.

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

    <?php $this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'page-grid',
    'dataProvider'=>$model->search(),
    'filter'=>$model,
    'columns'=>array(
    
    'category_id'   => array(
            'name'          => 'category_id',
            'filter'        => Category::all(),
            'value'         => '$model->category->title',
        ),
Выдает ошибку : Undefined variable: model

Пробовал обратиться по другому :

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

    <?php $this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'page-grid',
    'dataProvider'=>$model->search(),
    'filter'=>$model,
    'columns'=>array(
    
    'category_id'   => array(
            'name'          => 'category_id',
            'filter'        => Category::all(),
            'value'         => 'Page::model()->category->title',
           ),


Выдает ошибку тоже. Trying to get property of non-object

В общем как не пробовал, никак не выходит. А в видео уроках по которым я пытаюсь сделать блог, сделано по первому примеру и всё прекрасно работает. В общем не могу понять :(
masson
Сообщения: 545
Зарегистрирован: 2012.07.03, 15:59

Re: Вопрос по связям :)

Сообщение masson »

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

// Либо
columns = array(
array(
    'name' => 'category_title',
    // 'filter' => the HTML code representing a filter input (eg a text field, a dropdown list) that is used for this data column.
    'value' => '$data->category->title',
),
)

// Либо
columns = array(
array(
    'name' => 'category.title',
)
)

// Либо
columns = array(
    'category.title' , 'name' .... 
) 
AIR
Сообщения: 28
Зарегистрирован: 2014.10.31, 17:35

Re: Вопрос по связям :)

Сообщение AIR »

masson писал(а):

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

// Либо
columns = array(
array(
    'name' => 'category_title',
    // 'filter' => the HTML code representing a filter input (eg a text field, a dropdown list) that is used for this data column.
    'value' => '$data->category->title',
),
)

// Либо
columns = array(
array(
    'name' => 'category.title',
)
)

// Либо
columns = array(
    'category.title' , 'name' .... 
) 

Я зивиняюсь за наглось, а можно пожалуйста на моём примере кода как туда это вписать. Первый вариант не работает, так как не знает свойства $data. :( остальные 2 не могу понять куда вписть :(
masson
Сообщения: 545
Зарегистрирован: 2012.07.03, 15:59

Re: Вопрос по связям :)

Сообщение masson »

Именно на вашем примере все и было сделано.
Как выводится виджет CGridView - http://www.yiiframework.com/doc/api/1.1/CGridView
Что вписывать в св-во value колонки - http://www.yiiframework.com/doc/api/1.1 ... lue-detail

А "остальные 2 " это не остальные, а разные варианты написания одного и того же.
Да, и 'columns' в кавычки надо брать, тут я промахнулся ... схематично показывал, а не для копипасты :)
Последний раз редактировалось masson 2014.11.04, 17:13, всего редактировалось 1 раз.
AIR
Сообщения: 28
Зарегистрирован: 2014.10.31, 17:35

Re: Вопрос по связям :)

Сообщение AIR »

masson писал(а):Именно на вашем примере все и было сделано.
Как выводится виджет CGridView - http://www.yiiframework.com/doc/api/1.1/CGridView
Что вписывать в св-во value колонки - http://www.yiiframework.com/doc/api/1.1 ... lue-detail

А "остальные 2 " это не остальные, а разные варианты написания одного и того же.
Всё, заработало. $data это я так понял переменная которая работает с массивом данных подгружаемыx в виджет. По этому моя IDEшка его и не видела. Спасибо огромное за пояснение. Что то я тупанул очень сильно :)
Где тут плюсик к репутации поставить? :)
masson
Сообщения: 545
Зарегистрирован: 2012.07.03, 15:59

Re: Вопрос по связям :)

Сообщение masson »

AIR писал(а):Где тут плюсик к репутации поставить? :)
Не знаю. Да и ни к чему это детсадовское баловство 8-)
AIR
Сообщения: 28
Зарегистрирован: 2014.10.31, 17:35

Re: Вопрос по связям :)

Сообщение AIR »

masson писал(а):
AIR писал(а):Где тут плюсик к репутации поставить? :)
Не знаю. Да и ни к чему это детсадовское баловство 8-)
А можно еще вопрос?
Почему, когда я создал связь в relations() моя IDE (PHP Storm) просто отказывалась получать доступ к свойству 'category'?
Да и код не выполнялся, выдавал ошибку при вызове. После того как построил связь в самой базе, и с генерировал новую модель через gii оно автоматически построило связь и IDE начала подсвечивать и видеть её. С чем это может быть связано? Может где то нужно дописывать что то по связям?
masson
Сообщения: 545
Зарегистрирован: 2012.07.03, 15:59

Re: Вопрос по связям :)

Сообщение masson »

AIR писал(а): После того как построил связь в самой базе, и с генерировал новую модель через gii
Насколько я понимаю, связь в самой базе (в смысле MySQL relation) необязательна (во всяк.случае я их никогда не строю), а вот сгенерированная модель конечно же должна быть.

Когда пишется такой код

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

public function relations()
    {
        return array(
            'category' => array(self::BELONGS_TO, 'Category', 'category_id'),
        );
    } 
Модель Category должна существовать
AIR
Сообщения: 28
Зарегистрирован: 2014.10.31, 17:35

Re: Вопрос по связям :)

Сообщение AIR »

masson писал(а):
AIR писал(а): После того как построил связь в самой базе, и с генерировал новую модель через gii
Насколько я понимаю, связь в самой базе (в смысле MySQL relation) необязательна (во всяк.случае я их никогда не строю), а вот сгенерированная модель конечно же должна быть.

Когда пишется такой код

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

public function relations()
    {
        return array(
            'category' => array(self::BELONGS_TO, 'Category', 'category_id'),
        );
    }
Модель Category должна существовать
Вот как раз к 'category' Допустим так я обратиться не мог даже из контроллера.

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

$model->category->all();
 
Или так

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

 Page::model()->category->all();
 
Просто почему то не работало свойство 'category'. И при запуске выдавалась ошибка что не знает свойства 'category'.
Пока не пересоздал модель через gii :( Все модели были построены. И Page и Category. С чем это связано, я так и не понял. Хочется разобраться, чтобы в дальнейшем не наступать на эти же самые грабли. :)
masson
Сообщения: 545
Зарегистрирован: 2012.07.03, 15:59

Re: Вопрос по связям :)

Сообщение masson »

http://www.yiiframework.com/doc/api/1.1 ... All-detail

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

 $models = Page::model()->findAll(array('with'=>'category'));
foreach($models as $model)
    echo $model->category->name; 
AIR
Сообщения: 28
Зарегистрирован: 2014.10.31, 17:35

Re: Вопрос по связям :)

Сообщение AIR »

masson писал(а):http://www.yiiframework.com/doc/api/1.1 ... All-detail

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

 $models = Page::model()->findAll(array('with'=>'category'));
foreach($models as $model)
    echo $model->category->name; 
Ну пипец. findAll возвращает многомерный массив который нужно вытаскивать в цикле. Туплю дико. На этом мои вопросы закончились :)
Спасибо еще раз тебе, добрый человек :) Очень сильно помог :)
Ответить