我有一个包含3个表的数据库。这是一个简单的n-m关系。处理n-m关系的学生,课程和学生课程。我发布schema.yml作为参考,但它不是真的有必要。
Course:
connection: doctrine
tableName: course
columns:
id:
type: integer(4)
fixed: false
unsigned: false
primary: true
autoincrement: false
name:
type: string(45)
fixed: false
unsigned: false
primary: false
notnull: false
autoincrement: false
relations:
StudentHasCourse:
local: id
foreign: course_id
type: many
Student:
connection: doctrine
tableName: student
columns:
id:
type: integer(4)
fixed: false
unsigned: false
primary: true
autoincrement: false
registration_details:
type: string(45)
fixed: false
unsigned: false
primary: false
notnull: false
autoincrement: false
name:
type: string(30)
fixed: false
unsigned: false
primary: false
notnull: false
autoincrement: false
relations:
StudentHasCourse:
local: id
foreign: student_id
type: many
StudentHasCourse:
connection: doctrine
tableName: student_has_course
columns:
student_id:
type: integer(4)
fixed: false
unsigned: false
primary: true
autoincrement: false
course_id:
type: integer(4)
fixed: false
unsigned: false
primary: true
autoincrement: false
result:
type: string(1)
fixed: true
unsigned: false
primary: false
notnull: false
autoincrement: false
relations:
Course:
local: course_id
foreign: id
type: one
Student:
local: student_id
foreign: id
type: one
然后,我从以下查询中获取executeIndex()中表的数据。
$q_info = Doctrine_Query::create()
->select('s.*, shc.*, c.*')
->from('Student s')
->leftJoin('s.StudentHasCourse shc')
->leftJoin('shc.Course c')
->where('c.id = 1');
$this->infos = $q_info->execute();
然后我通过在indexSuccess.php中循环访问数据。但是,在indexSuccess中,我只能访问表Student中的数据。
<?php foreach ($infos as $info): ?>
<?php echo $info->getId(); ?>
<?php echo $info->getName(); ?>
<?php endforeach; ?>
我预计,我可以访问StudentHasCourse数据和课程数据,如下所示。 但是,它会产生错误。
<?php echo $info->getStudentHasCourse()->getResult()?>
<?php echo $info->getStudentHasCourse()->getCourse()->getName()?>
第一个声明发出警告;
警告:call_user_func_array()期望参数1是有效的回调,类'Doctrine_Collection'在D:\ wamp \ bin \ php \ php5.3.5 \ PEAR \ pear \ symfony \ escaper中没有方法'getCourse'第64行的\ sfOutputEscaperObjectDecorator.class.php
第二个陈述给出了上述警告和以下错误;
致命错误:在第5行的D:\ wamp \ www \ sam \ test_doc_1 \ apps \ frontend \ modules \ registration \ templates \ indexSuccess.php中的非对象上调用成员函数getName()
当我从调试工具栏检查查询时,它显示如下,它提供了我想要的所有数据。
SELECT s.id AS s__id, s.registration_details AS s__registration_details, s.name AS s__name, s2.student_id AS s2__student_id, s2.course_id AS s2__course_id, s2.result AS s2__result, c.id AS c__id, c.name AS c__name
FROM student s LEFT JOIN student_has_course s2 ON s.id = s2.student_id LEFT JOIN course c ON s2.course_id = c.id
WHERE (c.id = 1)
虽然问题很简短,但所提到的所有信息都变得如此之长。如果有人可以帮我解决这个问题,我们深表感激。我需要的是从StudentHasCourse和Course访问数据。如果此设计和此查询无法访问这些数据,则也欢迎使用任何其他方法。
答案 0 :(得分:1)
问题在于你没有定义一个n-m关系,而是两个1-n关系。从数据库的角度来看,这是完全相同的,但从应用程序的角度来看,当你可以得到两个易于使用的方法时,你得到4个没有太多语义价值的方法:Student::getCourses()
和Course::getStudents()
阅读this § of the doctrine1.2 documentation以了解如何实现这一目标。 StudentHasCourse
应该用作refClass
<强>更新强>
我只知道你将结果存储在StudentHasCourse
为了得到你想要的东西,在你的控制器中尝试这样的东西:
$this->courses = CourseTable::getInstance()
->createQuery('c')
->innerJoin('c.StudentHasCourse shc')
->where('shc.student_id = ?', $student_id)
->execute();
这意味着您仍然需要在课程类中使用StudentHasCourse关系。如果删除它,请将其恢复。
现在你应该能够在你的模板中做这样的事情
<ul>
<?php foreach($courses as $course): ?>
<li><?php echo $course //implement __toString in Course ?> : <?php echo $course->getStudentHasCourse()->getFirst()->getResult(); ?></li>
<?php endforeach;?>
</ul>