отношения многие ко многим на кохане 3.2 - PullRequest
4 голосов
/ 21 ноября 2011

У меня возникли проблемы при попытке сделать эту работу. У меня есть 2 модели, User_Pro и Категория. Я прочитал документацию по отношениям в руководстве по кохане и понял, что мне нужно определить отношение $_has_many для моделей User_Pro и Category и создать модель user_pro_categories с полем own_to.

Модель User_Pro:

protected $_has_many = array(
    'categories' => array(
        'model'   => 'TM_Category',
        'through' => 'user_pro_categories',
            'foreign_key' => 'id_user_pro',
    ),
);

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

protected $_has_many = array(
    'users_pro' => array(
        'model'   => 'TM_User_Pro',
        'through' => 'user_pro_categories',
        'foreign_key' => 'id_category',
    ),
);

user_pro_categories модель:

    protected $_belongs_to = array(
        'user_pro' => array(
            'model'       => 'TM_User_Pro',
            'foreign_key' => 'id_user_pro',
        ),
        'category' => array(
            'model'       => 'TM_Category',
            'foreign_key' => 'id_category',
        ),
);

Я получаю ошибку:

Database_Exception [ 1054 ]: Unknown column 'tm3_user_pro_categories.category_id' in 
'on clause' [ SELECT `tm3_tm_category`.* FROM `tm3_categories` AS `tm3_tm_category` JOIN 
`tm3_user_pro_categories` ON (`tm3_user_pro_categories`.`category_id` = `tm3_tm_category`.`id_category`) 
WHERE `tm3_user_pro_categories`.`id_user_pro` = '2' ]

Это похоже на то, что его не волнует fk, который я определил, и он хочет использовать суффикс ... какая-нибудь идея?

Ответы [ 2 ]

11 голосов
/ 21 ноября 2011

Вот пример, чтобы дать вам быстрое представление о том, как работает Kohana ORM. И желаю, чтобы это было полезно и другим.

Модель студента

<?php defined('SYSPATH') or die('No direct script access.');

class Model_Student extends ORM {

    protected $_primary_key = 'idstudent'; // take a look

    protected $_has_many = array(
        'courses'=> array(
            'model' => 'course',                // Course model
            'through' => 'students_courses',    // many-to-may through
            'far_key' => 'id_for_course',       // "column name" relating to the Course Model in "students_courses" table  
            'foreign_key' => 'id_for_student'   // "column name" relating to the Student Model in "students_courses" table
        ),
    );

}

Модель курса

<?php defined('SYSPATH') or die('No direct script access.');

class Model_Course extends ORM {

    protected $_primary_key = 'idcourse'; // take a look

    protected $_has_many = array(
        'students'=> array(
            'model'         => 'student',
            'far_key'       => 'id_for_student',
            'through'       => 'students_courses',
            'foreign_key'   => 'id_for_course'
        ),
    );

}

SQL Script

CREATE TABLE IF NOT EXISTS `students` (
  `idstudent` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`idstudent`)
) ENGINE=MyISAM;

INSERT INTO `students` (`idstudent`, `name`) VALUES
(1, 's1'),
(2, 's2');
/* column idcourse and PR idcourseS ? */
CREATE TABLE IF NOT EXISTS `courses` (
  `idcourse` int(11) NOT NULL,
  `name` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`idcourse`)
) ENGINE=MyISAM;

INSERT INTO `courses` (`idcourse`, `name`) VALUES
(1, 'c1'),
(2, 'c2'),
(3, 'c3');

CREATE TABLE IF NOT EXISTS `students_courses` (
  `id_for_student` int(10) unsigned NOT NULL,
  `id_for_course` int(10) unsigned NOT NULL
) ENGINE=MyISAM;

INSERT INTO `students_courses` (`id_for_student`, `id_for_course`) VALUES
(1, 1),
(1, 3);

    $student = new Model_Student(1);
    $courses = $student->courses->find_all();
    echo Debug::vars($courses);
    foreach($courses as $course) {
        echo Debug::vars($course->object());
    }

Выполнение кода выше создаст следующий запрос SQL.

SELECT `course`.* FROM `courses` AS `course` JOIN `students_courses` ON (`students_courses`.`id_for_course` = `course`.`idcourse`) WHERE `students_courses`.`id_for_student` = '1'
1 голос
/ 21 ноября 2011

Вам не нужно создавать модель для сводной таблицы для отношения многие ко многим.Просто определите параметр through в обеих моделях, убедитесь, что ваши первичные / внешние ключи соответствуют соглашению Kohana, и вы готовы к работе.Ниже приведен пример от пользователя и ролевых моделей Kohana ORM:

class Model_User
{
    protected $_has_many = array(
        'roles' => array('model' => 'role', 'through' => 'roles_users'),
    );
}

class Model_Role 
{
    protected $_has_many = array(
                 'users' => array('model' => 'user', 'through' => 'roles_users')
        );
}
...