我在尝试这项工作时遇到了一些麻烦。我有2个型号,User_Pro和Category。我阅读了关于kohana指南的关系文档,我理解我需要在User_Pro和Category模型上定义$_has_many
关系,并使用belongs_to字段创建模型user_pro_categories。
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,它想要使用后缀的东西......任何想法?
答案 0 :(得分:11)
以下示例可让您快速了解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脚本
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 :(得分:1)
您无需为多对多关系创建数据透视表的模型。只需在两个模型中定义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')
);
}