Вопрос по связям :)
Вопрос по связям :)
Добрый день уважаемые программисты и знатоки Yii
Я, наверное неделю уже мучаюсь со связями (relations) в Yii фреймворке и всё никак не получается.
Итак вопросы:
1) Нужно ли в самой базе указывать ключи и связи, чтобы потом реализовать их на YII и они заработали?
2) Как получить доступ к связи из view. (Я так понимаю, что через: имя_модели->название_связи. Название связи должно становиться свойством модели? Если да, то у меня, почему-то не становится и доступ к связи из модели, я получить не могу).
Заранее благодарен за ответы. Если добавите какие то примерчики наглядные, будет вообще хорошо.
Простите за нубство, я только изучаю
Я, наверное неделю уже мучаюсь со связями (relations) в Yii фреймворке и всё никак не получается.
Итак вопросы:
1) Нужно ли в самой базе указывать ключи и связи, чтобы потом реализовать их на YII и они заработали?
2) Как получить доступ к связи из view. (Я так понимаю, что через: имя_модели->название_связи. Название связи должно становиться свойством модели? Если да, то у меня, почему-то не становится и доступ к связи из модели, я получить не могу).
Заранее благодарен за ответы. Если добавите какие то примерчики наглядные, будет вообще хорошо.
Простите за нубство, я только изучаю
Re: Вопрос по связям :)
Если имеются в виду MySQL-relations - то необязательно. Достаточно просто проиндексировать по связываемым полям.AIR писал(а):1) Нужно ли в самой базе указывать ключи и связи, чтобы потом реализовать их на YII и они заработали?
Потому что надо имя_модели->название_связи->имя_поля_в_связываемой_таблице. А просто имя_модели->название_связи - это объект.AIR писал(а):2) Как получить доступ к связи из view. (Я так понимаю, что через: имя_модели->название_связи. Название связи должно становиться свойством модели? Если да, то у меня, почему-то не становится и доступ к связи из модели, я получить не могу).
Re: Вопрос по связям :)
masson писал(а):Если имеются в виду MySQL-relations - то необязательно. Достаточно просто проиндексировать по связываемым полям.AIR писал(а):1) Нужно ли в самой базе указывать ключи и связи, чтобы потом реализовать их на YII и они заработали?
Потому что надо имя_модели->название_связи->имя_поля_в_связываемой_таблице. А просто имя_модели->название_связи - это объект.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'),
);
}
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',
),
Пробовал обратиться по другому :
Код: Выделить всё
<?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
В общем как не пробовал, никак не выходит. А в видео уроках по которым я пытаюсь сделать блог, сделано по первому примеру и всё прекрасно работает. В общем не могу понять
Re: Вопрос по связям :)
Код: Выделить всё
// Либо
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' ....
)
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' .... )
Я зивиняюсь за наглось, а можно пожалуйста на моём примере кода как туда это вписать. Первый вариант не работает, так как не знает свойства $data. остальные 2 не могу понять куда вписть
Re: Вопрос по связям :)
Именно на вашем примере все и было сделано.
Как выводится виджет CGridView - http://www.yiiframework.com/doc/api/1.1/CGridView
Что вписывать в св-во value колонки - http://www.yiiframework.com/doc/api/1.1 ... lue-detail
А "остальные 2 " это не остальные, а разные варианты написания одного и того же.
Да, и 'columns' в кавычки надо брать, тут я промахнулся ... схематично показывал, а не для копипасты
Как выводится виджет 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 раз.
Re: Вопрос по связям :)
Всё, заработало. $data это я так понял переменная которая работает с массивом данных подгружаемыx в виджет. По этому моя IDEшка его и не видела. Спасибо огромное за пояснение. Что то я тупанул очень сильноmasson писал(а):Именно на вашем примере все и было сделано.
Как выводится виджет CGridView - http://www.yiiframework.com/doc/api/1.1/CGridView
Что вписывать в св-во value колонки - http://www.yiiframework.com/doc/api/1.1 ... lue-detail
А "остальные 2 " это не остальные, а разные варианты написания одного и того же.
Где тут плюсик к репутации поставить?
Re: Вопрос по связям :)
Не знаю. Да и ни к чему это детсадовское баловствоAIR писал(а):Где тут плюсик к репутации поставить?
Re: Вопрос по связям :)
А можно еще вопрос?masson писал(а):Не знаю. Да и ни к чему это детсадовское баловствоAIR писал(а):Где тут плюсик к репутации поставить?
Почему, когда я создал связь в relations() моя IDE (PHP Storm) просто отказывалась получать доступ к свойству 'category'?
Да и код не выполнялся, выдавал ошибку при вызове. После того как построил связь в самой базе, и с генерировал новую модель через gii оно автоматически построило связь и IDE начала подсвечивать и видеть её. С чем это может быть связано? Может где то нужно дописывать что то по связям?
Re: Вопрос по связям :)
Насколько я понимаю, связь в самой базе (в смысле MySQL relation) необязательна (во всяк.случае я их никогда не строю), а вот сгенерированная модель конечно же должна быть.AIR писал(а): После того как построил связь в самой базе, и с генерировал новую модель через gii
Когда пишется такой код
Код: Выделить всё
public function relations()
{
return array(
'category' => array(self::BELONGS_TO, 'Category', 'category_id'),
);
}
Re: Вопрос по связям :)
Вот как раз к 'category' Допустим так я обратиться не мог даже из контроллера.masson писал(а):Насколько я понимаю, связь в самой базе (в смысле MySQL relation) необязательна (во всяк.случае я их никогда не строю), а вот сгенерированная модель конечно же должна быть.AIR писал(а): После того как построил связь в самой базе, и с генерировал новую модель через gii
Когда пишется такой кодМодель Category должна существоватьКод: Выделить всё
public function relations() { return array( 'category' => array(self::BELONGS_TO, 'Category', 'category_id'), ); }
Код: Выделить всё
$model->category->all();
Код: Выделить всё
Page::model()->category->all();
Пока не пересоздал модель через gii Все модели были построены. И Page и Category. С чем это связано, я так и не понял. Хочется разобраться, чтобы в дальнейшем не наступать на эти же самые грабли.
Re: Вопрос по связям :)
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;
Re: Вопрос по связям :)
Ну пипец. findAll возвращает многомерный массив который нужно вытаскивать в цикле. Туплю дико. На этом мои вопросы закончились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;
Спасибо еще раз тебе, добрый человек Очень сильно помог