Русскоязычный форум, посвященный фреймворку Kohana

Все о фреймворке Kohana. Обсуждение уроков, документации.
Текущее время: 29 мар 2024, 06:24

Часовой пояс: UTC + 4 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
 Заголовок сообщения: ORM связи
СообщениеДобавлено: 20 июл 2012, 16:29 
Не в сети
Бывалый

Зарегистрирован: 11 июл 2012, 00:30
Сообщения: 31
таблица video от нее нужно добраться до таблицы video_incats, чтобы получить ид поджанров(таблица incats) далее уже от поджанров нужно добраться до таблицы categories

video - фильмы
incats_video - связывающая таблица(video с incats)
incats - поджанры

а также нужно сделать еще одну связь, чтобы получать категории. incats - categoryes(связь многие ко одному)

video -> incats_video(промежуточная таблица, связь многие к многим вроде) -> incats(эта таблица должна в свое очередь связываться с таблицей categories многие ко одному) -> categories(один ко многим с таблицей incats)
Как сделать такие связи ?
Помогите пожалуйста !!!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ORM связи
СообщениеДобавлено: 21 июл 2012, 05:40 
Не в сети
Бывалый
Аватара пользователя

Зарегистрирован: 05 июн 2012, 03:08
Сообщения: 213
Ты упорно не хочешь разобраться в том, что здесь написано viewtopic.php?f=31&t=247&start=10#p1247
Или объясни отличие между жанрами и категориями. У меня в примере четко видно, что есть что, чем жанры отличаются от категорий.
Почему у тебя жанры связаны с категориями?
Жанр это свойство фильма вроде, а не категории, куда ты собрался добираться?)

_________________
http://de-en.info (работает на Kohana 3.3)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ORM связи
СообщениеДобавлено: 21 июл 2012, 11:41 
Не в сети
Бывалый

Зарегистрирован: 11 июл 2012, 00:30
Сообщения: 31
AmberLEX писал(а):
Ты упорно не хочешь разобраться в том, что здесь написано viewtopic.php?f=31&t=247&start=10#p1247
Или объясни отличие между жанрами и категориями. У меня в примере четко видно, что есть что, чем жанры отличаются от категорий.
Почему у тебя жанры связаны с категориями?
Жанр это свойство фильма вроде, а не категории, куда ты собрался добираться?)

http://forum.kohanaframework.org/discus ... azi#Item_3 вот тут мне вроде помогли. У меня есть Категория - Комедии, поджанры - Семейные комедии и т.п., а подкатегорий у меня нет.
(Шерлок Холмс->промежуточная таблица->Семейные комедии)->Комедии. Вроде мне помогли на том форуме, но вопросы остались.1) Может ли быть в одной модели несколько связей многие ко многим ?2)Можно ли использовать в одной модели несколько связей ,допустим многие ко многим и много к одному ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ORM связи
СообщениеДобавлено: 21 июл 2012, 12:09 
Не в сети
Бывалый
Аватара пользователя

Зарегистрирован: 05 июн 2012, 03:08
Сообщения: 213
1) Может ли быть в одной модели несколько связей многие ко многим? - да
2) Можно ли использовать в одной модели несколько связей ,допустим многие ко многим и много к одному? - да

з.ы. какой вы твердый)
Да связи к таблицам можно какие угодно написать и сколько угодно, не в этом дело.

Уж разделили так разделили) Т.е. будет примерно так?
Код:
категория: комедии:
    жанр: семейные комедии
    жанр: детские комедии
    жанр: комедии для взрослых
категория: боевики
    жанр: боевики семейные
    жанр: боевики для детей
категория: сериалы
    жанр: семейные комедии
    жанр: для детей

Не вижу логики.
Напишите как я в списке выше, только свое, хочу посмотреть примерный список (хотябы из 3-х категорий и 7-10 поджанров или как вы их там называете) Это же не сложно - правда?
Я реально хочу понять что вы делаете.

_________________
http://de-en.info (работает на Kohana 3.3)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ORM связи
СообщениеДобавлено: 21 июл 2012, 12:56 
Не в сети
Бывалый

Зарегистрирован: 11 июл 2012, 00:30
Сообщения: 31
AmberLEX писал(а):
1) Может ли быть в одной модели несколько связей многие ко многим? - да
2) Можно ли использовать в одной модели несколько связей ,допустим многие ко многим и много к одному? - да

з.ы. какой вы твердый)
Да связи к таблицам можно какие угодно написать и сколько угодно, не в этом дело.

Уж разделили так разделили) Т.е. будет примерно так?
Код:
категория: комедии:
    жанр: семейные комедии
    жанр: детские комедии
    жанр: комедии для взрослых
категория: боевики
    жанр: боевики семейные
    жанр: боевики для детей
категория: сериалы
    жанр: семейные комедии
    жанр: для детей

Не вижу логики.
Напишите как я в списке выше, только свое, хочу посмотреть примерный список (хотябы из 3-х категорий и 7-10 поджанров или как вы их там называете) Это же не сложно - правда?
Я реально хочу понять что вы делаете.

http://www.dvdmart.ru/index.php?tree=11 ... genre=1740
С этого сайта я копировал это, посмотри, вроде логично...
Как можно использовать в одной модели несколько связей многие ко многим, можно пример ?, никак не пойму, там вроде только одно свойство в котором все прописывается.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ORM связи
СообщениеДобавлено: 21 июл 2012, 16:33 
Не в сети
Бывалый
Аватара пользователя

Зарегистрирован: 05 июн 2012, 03:08
Сообщения: 213
Ура, наконец-то! Так с этого нужно и начинать было. Тут все намного проще.
Тебе вообще пока 3 таблицы нужно (из них одна связующая), а не то, что ты там навыдумывал, впрочем, как я в самом начале и говорил)

1. Таблица разделов (назовем ее жанры - genres)
Код:
id  parent_id  title
1   0          Комедии
2   0          Боевики
3   0          Триллеры
4   3          Остросюжетные триллеры
5   3          Фантастические триллеры
6   3          Психологические триллеры
7   1          Криминальные комедии
8   1          Молодежные комедии
9   1          Приключенческие комедии
10  1          Фантастические комедии
11  2          Криминальные боевики
12  2          Военные боевики
13  2          Восточные единоборства
14  2          Комедийные боевики
15  2          Фантастические боевики

Разделы с parent_id = 0 - это пусть будут жанры (категории)
Разделы с parent_id != 0 - это пусть будут поджанры (подкатегории)
parent_id показывает к какому жанру относится поджанр.

2. Таблица фильмов (назовем ее фильмы - films)
Код:
id  title                                         description
1   Люди Икс: Первый класс (Positive Multimedia)  Описание к фильму Люди Икс: Первый класс
2   Другой мир 1-4 (Positive Multimedia) (4 DVD)  Описание к фильму Другой мир 1-4
3   Мачо и Ботан (Positive Multimedia)            Описание к фильму Мачо и Ботан

3. Связывающая таблица (назовем ее genre2film)
Код:
genre_id  film_id
2         3
14        3
2         1
5         1
5         2
2         2
15        1
Вот диаграмма: http://clip2net.com/s/28yTZ
Связь genres к films - это связь "многие-ко-многим", т.е. к любому жанру может относится несколько фильмов и любой фильм может относится к нескольким жанрам.
Такая связь реализуется через промежуточную таблицу, т.е. фактически genres относится к genre2film как "один-ко-многим" и films к genre2film как "один-ко-многим" (читать литературу по базам данных)
Вот так это выглядит в базе. А с помощью kohana ORM мы можем это все описать в коде и работать с этим, как с классами, используя методы и свойства.

Все! И как я в самом начале писал тут viewtopic.php?f=31&t=247#p1226 - так это и реализуется.
Код:
class Model_Genre extends ORM
{
   protected $_has_many = array(
      'films' => array(
         'model'   => 'film',
         'through' => 'genre2film',
      ),
   );
}

class Model_Film extends ORM
{
   protected $_has_many = array(
      'genres' => array(
         'model'   => 'genre',
         'through' => 'genre2film',
      ),
   );
}
Код:
class Controller_Catalogue extends Controller_Template
{
    /**
     * Список фильмов (по id жанра) 
     * Например http://catalogue/genre/1
     */
    public function action_genre()
    {
        // id жанра
        $id = $this->request->param('id');

        // Получаем жанр
        $o_genre = ORM::factory('genre', $id);

        if ( ! $o_genre->loaded())
            throw new HTTP_Exception_404();

        // Получаем все фильмы этого жанра
        // Здесь как раз используется псевдоним (алиас) 'films' указанный в $_has_many Model_Genre
        $o_films = $o_genre->films->find_all();

        $this->template->title   = 'Films';
        $this->template->content = View::factory('catalogue/genre',
            array(
                'o_genre' => $o_genre,
                'o_films' => $o_films,
            ));
    }

    /**
     * Выводим фильм (по id фильма) 
     * Например http://catalogue/film/1
     */
    public function action_film()
    {
        // id фильма
        $id = $this->request->param('id');

        // Получаем фильм
        $o_film = ORM::factory('film', $id);

        if ( ! $o_film->loaded())
            throw new HTTP_Exception_404();

        // Получаем все жанры этого фильма
        // Здесь как раз используется псевдоним (алиас) 'genres' указанный в $_has_many Model_Film
        $o_genres = $o_film->genres->find_all();

        $this->template->title = 'Film';
        $this->template->content = View::factory('catalogue/film',
            array(
                
'o_film'   => $o_film,
                'o_genres' => $o_genres,
            ));
    }
}
 
genre.php
Код:
echo '<h1>' . $o_genre->title . '</h1>';

// Список фильмов жанра
foreach ($o_films as $o_film)
{
    echo $o_film->title . '<br />';
}
 
film.php
Код:
echo '<h1>' . $o_film->title . '</h1>';

// Список жанров фильма
foreach ($o_genres as $o_genre)
{
    echo $o_genre->title . '<br />';
}
 
На данный момент этой структуры вполне достаточно для того примера, а не то, что ты там наворотил)
Смотри методы ORM для работы с базой и связями.
И чего было голову морочить?))

Как добавлять фильм в категорию писал тут: viewtopic.php?f=31&t=247#p1237
Т.е. при добавлении фильма передашь массив id-шников, отмеченных (выбранных) жанров и делаешь типа такого:
Код:
    // Сохраняем фильм
    $obj->save();
    // Добавляем в genre2film id-шники выбранных жанров
    $obj->add('genres', $cids);
 
Только с хлебными крошками не все просто, но если вложенность всего 2 (жанры-поджанры), то можно сделать и на 1 запрос больше.
Так же (в будущем) как на том сайте можно к таблице genres добавить поле type (FILMS, MULT, MUSIC) и делать выборку главных разделов с учетом типа используя все те же 3 таблицы (ну или типа того, нужно подумать, но пока этого достаточно)
Инфы с головой!!! Портал писать за тебя не буду)
Надеюсь это понятно. Понятнее уже не напишу. Куда ты там пытался добраться, надеюсь уже не понадобится)

_________________
http://de-en.info (работает на Kohana 3.3)


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Часовой пояс: UTC + 4 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Все о фреймворке Kohana  | 
Powered by phpBB® Forum Software © phpBB Group