Русскоязычный форум, посвященный фреймворку Kohana
http://forum.kohanaframework.su/

Подгрузка связей в ORM
http://forum.kohanaframework.su/viewtopic.php?f=33&t=674
Страница 1 из 1

Автор:  vchv [ 11 июн 2013, 15:04 ]
Заголовок сообщения:  Подгрузка связей в ORM

День добрый! Народ подскажите по связям и их подгрузке

Есть модель которая понятно с чем и как связана
Код:
class Model_Article extends ORM {
   
   protected $_table_name = 'articles';
   protected $_belongs_to = array(
              'article'  => array(
         'model'       => 'articlecat',
         'foreign_key' => 'category_id',)
         );

Вызов в контроллере происходит банально
Код:
$articles = ORM::factory('Article');
    $articles = $articles->order_by('id', 'DESC') // DESC или ASC
                   ->limit(1)
                   ->offset(0)
                   ->with('articlecat')
                   ->find_all();

[url]http://kohana3.ru/module/orm#многие-ко-многим[/url] вроде бы метод ->with('articlecat') должен формировать и подгружать данные по запросу
Код:
SELECT `category`.`id` AS `category:id`, `category`.`name` AS `category:name`, `post`.* FROM `posts` AS `post`
LEFT JOIN `categories` AS `category` ON (`category`.`id` = `post`.`category_id`)

т.е. выбирать категорию которой соответствует статья. Конечно же приведенный код не работает потому что я никак не соображу как же передать category_id последней статьи в id category(туфталогия какаято :D ). И собственно вопросы:
как же передать эту долбаную category_id в id category;
в оф.мануале ко3.3 описания метода не нашел, работает ли он с кохана 3.3;

ПОМОГИТЕ ДИЛЕТАНТУ!!! ПОЖАЛУЙСТА!!!

Автор:  WinterSilence [ 11 июн 2013, 16:30 ]
Заголовок сообщения:  Re: Подгрузка связей в ORM

что твой код должен делать? выводить последнюю добавленную статью?

Автор:  vchv [ 11 июн 2013, 16:54 ]
Заголовок сообщения:  Re: Подгрузка связей в ORM

WinterSilence писал(а):
что твой код должен делать? выводить последнюю добавленную статью?

Статью он выводит. Никак не соображу каким образом вытащить из получаемых данных значение поля category_id и по этому параметру вывести название категории к которой принадлежит статья.

Автор:  vchv [ 11 июн 2013, 17:07 ]
Заголовок сообщения:  Re: Подгрузка связей в ORM

Код:
Database_Exception [ 1054 ]: Unknown Column 'Articlecat.Category_id' In 'Where Clause' [ SELECT `Articlecat`.`Id` AS `Id`, `Articlecat`.`Title` AS
 `Title`, `Articlecat`.`Alt_title` AS `Alt_title` FROM `Articlecats` AS `Articlecat` WHERE `Articlecat`.`Category_id` = '63' LIMIT 1 ]

при использовании подгрузки выдает вышеупомянутую ошибку, т.е. ээээээ...умммм...ээээмммм нехватает самой малости чтобы догнать как работает метод подгрузки

Автор:  vchv [ 11 июн 2013, 17:35 ]
Заголовок сообщения:  Re: Подгрузка связей в ORM

РЕШИЛ!!!!ЗАРАБОТАЛА!!!
В общем суть проблемы сводилась к тому что бы подгрузить название категории к статье, на форуме где то обсуждалось, но кода было очень много, на метод подгрузки набрел случайно вот его реализация.
Модель
Код:
class Model_Article extends ORM {
   
   protected $_table_name = 'articles';
   protected $_belongs_to  = array(
      'articlecats'  => array(
         'model'       => 'articlecat',
         'foreign_key' => 'category_id',)
         );

Контроллер
Код:
$articles = ORM::factory('Article');
         $articles = $articles->order_by('id', 'DESC') // DESC или ASC
                   ->limit(1)
                   ->offset(0)
                   ->with('articlecats')// ЗАМЕЧАТЕЛЬНЫЙ МЕТОД КОХАНА - ПОДГУЗКА СВЯЗИ
                   ->find_all();

Метод with формирует запрос (пример)
Код:
SELECT `category`.`id` AS `category:id`, `category`.`name` AS `category:name`, `post`.* FROM `posts` AS `post`
LEFT JOIN `categories` AS `category` ON (`category`.`id` = `post`.`category_id`)

Вид
Код:
<?php echo URL::site('article/'. $article->articlecats->id .'-'. $article->articlecats->alt_title); ?>">
<?php echo $article->articlecats->title; ?>

Резюмирую:
метод with обращается к модели и подгружает связь указанную в псевдониме и передает ее в формируемый объект класса.
Модератор, прошу прощения не знаю как удалить лишние "записки сумасшедшего"

Автор:  WinterSilence [ 11 июн 2013, 18:18 ]
Заголовок сообщения:  Re: Подгрузка связей в ORM

эээ а зачем
Цитата:
->with('articlecats')// ЗАМЕЧАТЕЛЬНЫЙ МЕТОД КОХАНА - ПОДГУЗКА СВЯЗИ

если ты уже задал $_belongs_to ?

http://kohanaframework.org/3.3/guide/or ... ips#hasone

Автор:  vchv [ 11 июн 2013, 19:07 ]
Заголовок сообщения:  Re: Подгрузка связей в ORM

WinterSilence писал(а):
эээ а зачем
Цитата:
->with('articlecats')// ЗАМЕЧАТЕЛЬНЫЙ МЕТОД КОХАНА - ПОДГУЗКА СВЯЗИ

если ты уже задал $_belongs_to ?

http://kohanaframework.org/3.3/guide/or ... ips#hasone

"Подгрузка связей работает только со связями типа «Один к одному» (has one) и «Много к одному» (belongs to)."
http://kohana3.ru/module/orm#много-к-одному
написано же было помогите дилетанту)))
Честно говоря не экспериментировал, остановился на рабочем варианте, но очевидно удобство - определить связи в модели и определить метод в объекте класса ....

Автор:  WinterSilence [ 11 июн 2013, 19:34 ]
Заголовок сообщения:  Re: Подгрузка связей в ORM

я тоже не шибко специалист, но получается ты одну и туже модель дважды добавляешь, но по разному. по идее достаточно $_belongs_to или $_has_one у модели прописать и $article->articlecats->id будет работать

Код:
Let's say your Post database table schema doesn't have a user_id column but instead has an author_id column which is a foreign key for a record in the User table. You could use code like this:

?
protected $_belongs_to = array(
    'user' => array(
        'foreign_key' => 'author_id',
    ),
);

If you wanted access a post's author by using code like $post->author then you would simply need to change the alias and add the model index:

?
protected $_belongs_to = array(
    'author' => array(
        'model'       => 'User',
    ),
);

Автор:  vchv [ 12 июн 2013, 11:38 ]
Заголовок сообщения:  Re: Подгрузка связей в ORM

WinterSilence писал(а):
я тоже не шибко специалист, но получается ты одну и туже модель дважды добавляешь, но по разному. по идее достаточно $_belongs_to или $_has_one у модели прописать и $article->articlecats->id будет работать

Код:
Let's say your Post database table schema doesn't have a user_id column but instead has an author_id column which is a foreign key for a record in the User table. You could use code like this:

?
protected $_belongs_to = array(
    'user' => array(
        'foreign_key' => 'author_id',
    ),
);

If you wanted access a post's author by using code like $post->author then you would simply need to change the alias and add the model index:

?
protected $_belongs_to = array(
    'author' => array(
        'model'       => 'User',
    ),
);

Привет, глубоко не ковырял, проверю отпишусь

Страница 1 из 1 Часовой пояс: UTC + 4 часа [ Летнее время ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/