0

我有一个实体用户

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()

它假设一个用户有许多工作样本,而一个工作样本只有一个用户。

有什么帮助吗?

4

1 回答 1

2

在使用您的代码之前

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

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

之后使用以下命令更新您的数据库:

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

并清除缓存:

app/console cache:clear

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

然后:你不需要private $userid;inWorksamples也不需要$this->worksample = new ArrayCollection();in Users。Doctrine 将为您处理这一切。$worksample重命名为也很好,$worksamples因为它总是返回一个arrayCollection而不是单个对象。

一切设置正确后,您可以简单地使用$workspace->getUser()which 将返回User附加到此特定对象的类对象。

在您的控制器中

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

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

一些注意事项:

  • 类的构造函数被调用__construct()而不是__constraction()
  • User由于单个对象代表用户或工作区,因此您的类也应该以Wokrspace单数形式命名。
于 2013-08-28T08:53:53.880 回答