原则 2 - 多对一关联不起作用



我需要帮助以下代码。我有两个分支:

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

相关内容

  • 没有找到相关文章

最新更新