1

我需要使用以下代码。我有这两个类:

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') 和其他组合无济于事。

有人可以告诉我我做错了什么吗?

提前致谢。

4

2 回答 2

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在注释上设置。

于 2013-11-07T17:42:19.493 回答
0

如果“j”是您的工作表,则不能使用 j.expert,因为(据我所知)这不是您的表/实体的属性。您将字段命名为“expert_id”。我想应该是:

$Q = $this->getQueryBuilder('j')
                  ->where('j.assigned_expert = :expert_id')
                  ->setParameter('expert_id', $id)
                  ->getQuery()

@alvk4:他解释了为什么不使用双向关联。你的建议,如果我错了,请原谅我,是双向关联。

于 2013-11-07T18:48:58.240 回答