Symfony 1.4 / Doctrine;无法在模板中访问n-m关系数据(indexSuccess)

时间:2011-11-27 17:27:46

标签: doctrine symfony-1.4 dql

我有一个包含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访问数据。如果此设计和此查询无法访问这些数据,则也欢迎使用任何其他方法。

1 个答案:

答案 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>