Symfony 1.4 / Доктрина; Данные отношения n-m не доступны в шаблоне (indexSuccess) - PullRequest
2 голосов
/ 27 ноября 2011

У меня есть база данных с 3 таблицами.Это простые отношения НМ.Student, Course и StudentHasCourse для управления отношениями NM.Я выкладываю 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'не имеет метода 'getCourse' в D: \ wamp \ bin \ php \ php5.3.5 \ PEAR \ pear \ symfony \ escaper \ sfOutputEscaperObjectDecorator.class.php в строке 64

и второйинструкция выдает вышеупомянутое предупреждение и следующую ошибку:

Неустранимая ошибка: вызов функции-члена getName () для необъекта в D: \ wamp \ www \ sam \ test_doc_1 \ apps \ frontend\ modules \ registration \ templates \ indexSuccess.php в строке 5

Когда я проверяю запрос на панели инструментов отладки, он выглядит следующим образом и выдает все необходимые данные.

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 Ответ

1 голос
/ 27 ноября 2011

Проблема заключается в том, что вы определили не отношение nm, а два отношения 1-n.Это вполне эквивалентно с точки зрения базы данных, но с точки зрения приложения вы получаете 4 метода, которые не имеют большого семантического значения, когда вы можете получить два простых в использовании метода: Student::getCourses() и Course::getStudents()

Прочтите этого § документации доктрины1.2 , чтобы узнать, как этого добиться.StudentHasCourse следует использовать в качестве вашего refClass

ОБНОВЛЕНИЕ Я только что понял, что вы сохранили результат в StudentHasCourse Чтобы получить то, что вы хотите, попробуйте что-то подобное в вашем контроллере:

$this->courses = CourseTable::getInstance()
  ->createQuery('c')
    ->innerJoin('c.StudentHasCourse shc')
        ->where('shc.student_id = ?', $student_id)
        ->execute();

Это означает, что вам все еще нужно отношение StudentHasCourse в классе Course.Восстановите его, если вы удалили его.

Теперь вы должны иметь возможность сделать что-то подобное в своем шаблоне

<ul>
<?php foreach($courses as $course): ?>
  <li><?php echo $course //implement __toString in Course ?> : <?php echo $course->getStudentHasCourse()->getFirst()->getResult(); ?></li>
<?php endforeach;?>
</ul>
...