学说2 - ManyToOne协会无法正常工作

时间:2013-11-07 17:12:46

标签: symfony doctrine-orm associations

我需要一只手使用以下代码。 我有这两个分支:

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

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

提前致谢。

2 个答案:

答案 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:他解释了为什么他没有使用双向关联。你所建议的,如果我错了就原谅我,是双向联想。

相关问题