symfony 2错误:在*中的非对象上调用成员函数*

时间:2013-08-28 08:23:55

标签: symfony doctrine entity-relationship

我有一个实体用户

class Users
{
  //...

/**
 * @ORM\Column(name="firstName", type="string", length=50, nullable=true)
 */
private $firstname;

public function getFirstname()
{
    return $this->firstname;
}

/*
*@ORM\OneToMany(targetEntity='Worksamples', mappedBy='user')
*/
private $worksample;

public function __constraction()
{
    $this->worksample = new ArrayCollection();
}

public function getWorksample()
{
    $this->worksample;
}

}

另一个名为Worksamples的实体

class Worksamples
{
 //...

/**
 * @ORM\Column(name="sampleSource", type="string", length=255, nullable=false)
 */
private $samplesource;

public function getSamplesource()
{
    return $this->samplesource;
}

/**
 * @ORM\Column(name="UserId", type="integer", nullable=false)
 */
private $userid;   

public function getUserid()
{
    return $this->userid;
}


/*
*@ORM\ManyToOne(targetEntity="Users", inversedBy="worksample")
*@ORM\JoinColumn(name="UserId", referencedColumnName="id")
*/
private $user;

public function getUser()
{
    return $this->user;
}

}

在我的控制器中我有这个动作

public function indexAction($id)
{
    $user = $this->getDoctrine()
        ->getRepository('AcmeWellcomeBundle:Users')
        ->find($id);

    $sample = $user->getWorksample()->getSamplesource();

    return $this->render('AcmeWellcomeBundle:Default:index.html.twig', array('sample' => $sample));

}

我有这个错误

  

FatalErrorException:错误:在....中的非对象上调用成员函数getSamplesource()

它假设用户有许多Worksamples,而Worksample只有一个用户。

任何帮助?

1 个答案:

答案 0 :(得分:2)

在使用代码之前

您是否通过应用的控制台运行课程?如果没有在您的终端或控制台上通过服务器上的SSH执行此操作:

php app/console doctrine:generate:entities [YourVendorName]

然后使用以下方式更新您的数据库:

php app/console doctrine:schema:update --force

明确缓存:

app/console cache:clear

这些步骤将确保实际使用所有注释并正确设置数据库。

然后:您private $userid;中不需要Worksamples$this->worksample = new ArrayCollection();中不需要Users。 Doctrine将为您处理所有这些。此外,最好将$worksample重命名为$worksamples,因为它始终会返回arrayCollection而不会返回单个对象。

如果设置正确,只需使用$workspace->getUser(),它将返回附加到此特定对象的类User的对象。

在您的控制器中

首先获取工作样本列表。然后检查是否有任何工作样本附加到对象。然后例如从列表中的第一个对象获取vlue:

$samples = $user->getWorksamples();
if ($samples) {
    $sample = $samples[0]->getSamplesource();
}

有些说明:

  • 类的构造函数名为__construct()而不是__constraction()
  • 由于单个对象代表用户或工作区,因此您的类也应以单数形式命名为UserWokrspace