我需要一只手使用以下代码。 我有这两个分支:
Class Expert{
/**
* @var integer
*
* @ORM\Id
* @ORM\Column(name="id", type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\Column(name="username", type="string", length=255)
* @Assert\NotBlank()
*/
protected $username;
/**
* @ORM\Column(name="email", type="string", length=255, unique=true)
* @Assert\NotBlank()
*/
protected $email;
/**
* @ORM\Column(name="password", type="string", length=40)
* @Assert\NotBlank()
*/
protected $password;
}
Class Job{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\Column(name="titulo", type="string", length=255)
* @Assert\NotBlank()
*/
protected $title;
/**
* @ORM\Column(name="description", type="text")
* @Assert\NotBlank()
*/
protected $description;
/**
* @ORM\ManyToOne(targetEntity="Expert")
* @ORM\JoinColumn(name="expert_id", referencedColumnName="id")
*/
protected $assigned_expert;
}
这个自定义存储库:
class JobRepository extends EntityRepository
{
public function getTechnicianFinishedJobs($id)
{
$Q = $this->getQueryBuilder('j')
->where('j.expert = :expert_id')
->setParameter('expert_id', $id)
->getQuery()
try{
return $q->getResult();
}catch(NoResultException $e){
return false;
}
}
}
当我运行时,我收到以下错误:
[Semantical Error] line 0, col 68 near 'expert = :e': Error: Class Job has no field or association named expert
这个想法是可以将一个专家分配给许多工作,并且可以将一个工作分配给一个专家。这项工作需要知道谁是指定的专家,而不是相反,所以这就是我使用ManyToOne单向关联的原因。 我尝试将存储库更改为 - > where('j.expert_id =:expert_id')和其他组合无效。
有人可以告诉我我做错了吗?
提前致谢。
答案 0 :(得分:0)
您错过了注释中的内容,请参阅一个有效的示例:
/**
* Fluency\Bundle\DesktopBundle\Entity\Application
*
* @ORM\Table(
* name="desktop.applications",
* uniqueConstraints={
* @ORM\UniqueConstraint(name="applications_jsid_key", columns={"jsid"}),
* @ORM\UniqueConstraint(name="applications_type_key", columns={"type"}),
* @ORM\UniqueConstraint(name="applications_classname_key", columns={"classname"})
* }
* )
* @ORM\Entity(repositoryClass="Fluency\Bundle\DesktopBundle\Entity\Repository\ApplicationRepository")
*/
class Application
{
...
/**
* @var ArrayCollection
*
* @ORM\OneToMany(targetEntity="Fluency\Bundle\DesktopBundle\Entity\ApplicationFile", mappedBy="application", cascade={"persist"})
* @ORM\JoinTable(name="desktop.application_files",
* joinColumns={
* @ORM\JoinColumn(name="idapplication", referencedColumnName="idapplication")
* }
* )
*/
private $files;
...
}
/**
* Fluency\Bundle\DesktopBundle\Entity\ApplicationFile
*
* @ORM\Table(name="desktop.application_files")
* @ORM\Entity
*/
class ApplicationFile
{
...
/**
* @var \Fluency\Bundle\DesktopBundle\Entity\Application
*
* @ORM\ManyToOne(targetEntity="Application", inversedBy="files")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="idapplication", referencedColumnName="idapplication", onDelete="CASCADE")
* })
*/
private $application;
...
}
在我的存储库类中查看DQL的工作示例:
...
public function getApplicationFilesByJsid($jsid)
{
if(empty($jsid) OR !$jsid OR !is_string($jsid))
{
throw new \Psr\Log\InvalidArgumentException();
}
$query = $this->getEntityManager()->createQueryBuilder()
->select('a, af, m, ft')
->from($this->getEntityName(), 'a')
->innerJoin('a.files', 'af')
->innerJoin('a.module', 'm')
->innerJoin('af.filetype', 'ft')
->where('a.active = 1 AND a.jsid = :jsid')
->setParameter('jsid', $jsid)
->orderBy('af.id', 'ASC')
->getQuery();
$applicationFiles = $query->getSingleResult(\Doctrine\ORM\Query::HYDRATE_ARRAY);
return $applicationFiles;
}
...
@enigma:是双向的,但你的DQL是正确的,j.assigned_expert
,但无论如何专家都拥有关系的一面,他也需要在注释上设置mappedBy=assigned_expert
。
答案 1 :(得分:0)
如果'j'是您的作业表,则不能使用j.expert,因为这是(据我所知)没有您的表/实体的属性。您将字段命名为“expert_id”。 我想它应该是:
$Q = $this->getQueryBuilder('j')
->where('j.assigned_expert = :expert_id')
->setParameter('expert_id', $id)
->getQuery()
@ alvk4:他解释了为什么他没有使用双向关联。你所建议的,如果我错了就原谅我,是双向联想。