我需要帮助以下代码。我有两个分支:
Class Expert{
/**
* @var integer
*
* @ORMId
* @ORMColumn(name="id", type="integer")
* @ORMGeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORMColumn(name="username", type="string", length=255)
* @AssertNotBlank()
*/
protected $username;
/**
* @ORMColumn(name="email", type="string", length=255, unique=true)
* @AssertNotBlank()
*/
protected $email;
/**
* @ORMColumn(name="password", type="string", length=40)
* @AssertNotBlank()
*/
protected $password;
}
Class Job{
/**
* @var integer
*
* @ORMColumn(name="id", type="integer")
* @ORMId
* @ORMGeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORMColumn(name="titulo", type="string", length=255)
* @AssertNotBlank()
*/
protected $title;
/**
* @ORMColumn(name="description", type="text")
* @AssertNotBlank()
*/
protected $description;
/**
* @ORMManyToOne(targetEntity="Expert")
* @ORMJoinColumn(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') 和其他组合,但无济于事。
有人可以告诉我我做错了什么吗?
提前谢谢。
如果"j"是你的作业表,你不能使用 j.expert,因为据我所知,这不是你的表/实体的属性。您将字段命名为"expert_id"。我想应该是:
$Q = $this->getQueryBuilder('j')
->where('j.assigned_expert = :expert_id')
->setParameter('expert_id', $id)
->getQuery()
@alvk4:他解释了为什么他不使用双向关联。你的建议,如果我错了,请原谅我,是双向联想。
您在注释中遗漏了一些内容,请参阅一个工作示例:
/**
* FluencyBundleDesktopBundleEntityApplication
*
* @ORMTable(
* name="desktop.applications",
* uniqueConstraints={
* @ORMUniqueConstraint(name="applications_jsid_key", columns={"jsid"}),
* @ORMUniqueConstraint(name="applications_type_key", columns={"type"}),
* @ORMUniqueConstraint(name="applications_classname_key", columns={"classname"})
* }
* )
* @ORMEntity(repositoryClass="FluencyBundleDesktopBundleEntityRepositoryApplicationRepository")
*/
class Application
{
...
/**
* @var ArrayCollection
*
* @ORMOneToMany(targetEntity="FluencyBundleDesktopBundleEntityApplicationFile", mappedBy="application", cascade={"persist"})
* @ORMJoinTable(name="desktop.application_files",
* joinColumns={
* @ORMJoinColumn(name="idapplication", referencedColumnName="idapplication")
* }
* )
*/
private $files;
...
}
/**
* FluencyBundleDesktopBundleEntityApplicationFile
*
* @ORMTable(name="desktop.application_files")
* @ORMEntity
*/
class ApplicationFile
{
...
/**
* @var FluencyBundleDesktopBundleEntityApplication
*
* @ORMManyToOne(targetEntity="Application", inversedBy="files")
* @ORMJoinColumns({
* @ORMJoinColumn(name="idapplication", referencedColumnName="idapplication", onDelete="CASCADE")
* })
*/
private $application;
...
}
在我的存储库类上查看 DQL 的工作示例:
...
public function getApplicationFilesByJsid($jsid)
{
if(empty($jsid) OR !$jsid OR !is_string($jsid))
{
throw new PsrLogInvalidArgumentException();
}
$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(DoctrineORMQuery::HYDRATE_ARRAY);
return $applicationFiles;
}
。
@enigma:是的,是双向的,但你的DQL是对的,会j.assigned_expert
,但无论如何,专家是关系的所有权方,他也需要在注释上设置mappedBy=assigned_expert
。