在Symfony中加入多个表的问题

时间:2013-01-16 06:57:27

标签: php symfony doctrine doctrine-orm

我有三个使用注释链接在一起的实体。我有一个UserStudentRecording表。

目前,录制实体包含一个链接到学生实体的StudentID字段,学生实体的ID链接到用户实体中的UserID。

我的问题是,当我使用Doctrine:

通过查询获得一个Recording对象数组时
$studentRecordings = $this->getDoctrine()->getRepository('StudentBundle:Recording')
            ->findBy(
            array('pageID' => $pageObject, 'studentID' => $studentObject),
            array('filename' => 'ASC')
        );

我收到错误,无法访问学生信息。

["studentID"]=>
  object(stdClass)#552 (6) {
    ["__CLASS__"]=>
    string(39) "Acme\studentBundle\Entity\Student"
    ["__IS_PROXY__"]=>
    bool(true)
    ["__PROXY_INITIALIZED__"]=>
    bool(false)
    ["id"]=>
    NULL
    ["class"]=>
    NULL
    ["parent"]=>
    NULL
  }

然后给我一个错误Call to a member function getId() on a non-object in StudentBundle/Entity/Student.php

Recording.php:

class Recording
{

    public $file;

    /**
     * @ORM\Id
     * @ORM\Column(name="id",type="integer")
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    protected $recordingID;


    /**
     * @ORM\ManyToOne(targetEntity="Page")
     * @ORM\JoinColumn(name="pageID", referencedColumnName="id")
     */
    protected $pageID;

    /**
     * @ORM\ManyToOne(targetEntity="Student")
     * @ORM\JoinColumn(name="student", referencedColumnName="id")
     */
    protected $studentID;

    /**
     * @ORM\Column(name="filename", type="string")
     */
    protected $filename;

Student.php

class Student
{
    /**
     * @ORM\Id
     * @ORM\OneToOne(targetEntity="User")
     * @ORM\JoinColumn(name="id", referencedColumnName="id")
     */
    protected $id;

    /**
     * @ORM\Id
     * @ORM\ManyToOne(targetEntity="Classes")
     * @ORM\JoinColumn(name="class", referencedColumnName="id")
     */
    protected $class;

    /**
     * @ORM\Id
     * @ORM\ManyToOne(targetEntity="User")
     * @ORM\JoinColumn(name="parent", referencedColumnName="id")
     */
    protected $parent;

user.php的

class User implements UserInterface
{
    /**
     * @ORM\id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    protected $id;

    /**
     * @ORM\Column(type="string")
     */
    protected $first_name;
    /**
     * @ORM\Column(type="string")
     */
    protected $last_name;
    /**
     * @ORM\ManyToOne(targetEntity="Role")
     * @ORM\JoinColumn(name="role", referencedColumnName="id")
     */
    protected $role;

    /**
     * @ORM\Column(type="string")
     */
    protected $username;
    /**
     * @ORM\Column(type="string")
     */
    protected $password;
    /**
     * @ORM\Column(type="string")
     */
    protected $email;
    /**
     * @ORM\Column(type="string")
     */
    protected $salt;

    /**
     * @ORM\Column(name="is_active", type="integer")
     */
    protected $isActive;

编辑:好的,所以基本上学生对象有一个基本返回$this->student->getID();的getID函数 错误是$this->student应该是一个对象,它似乎不在这种情况下。

编辑2:好的,我遇到了一个非常奇怪的情况。假设我有两个ID为1和5的学生帐户,当我将getRepository()称为学生1时,如果我指定'studentID' => 1,则会给出该错误,但是如果我将其更改为{{ 1}}它有效。当我登录学生5并做同样的事情时,也会发生这种情况。

基本上,如果它与Logged in Student

相匹配,它只会给出错误

3 个答案:

答案 0 :(得分:1)

我认为你不能使用StudentID =1。您需要拥有学生对象。 StudentID是您的学生对象。

你命名是错误的。在你的课堂上它应该像

受保护的$student而不是$studentID

然后在查询中你需要像这样的学生对象

$student = $this->getDoctrine()->getRepository('StudentBundle:Student').find(1)

array('pageID' => $pageObject, 'student' => $student)

答案 1 :(得分:0)

连接列名称中的错误?

class Recording
{
//..

  /**
    * @ORM\ManyToOne(targetEntity="Student")
    * @ORM\JoinColumn(name="student_id", referencedColumnName="id")
    */
    protected $studentID;
}

答案 2 :(得分:0)

/**
  * @ORM\ManyToOne(targetEntity="Student")
  * @ORM\JoinColumn(name="student_id", referencedColumnName="id")
  */
  protected $studentID;

to

/**
  * @ORM\ManyToOne(targetEntity="Student")
  * @ORM\JoinColumn(name="studentID_id", referencedColumnName="id")
  */
  protected $studentID;

if you keep var name also need to keep it in joincolumn