5

親が複合主キーで構成され、親がサブジェクトと呼ばれ、子がコースである子を除外しようとしています:

主題:

class Subject
{
   /**
     * @var integer
     *
     * @Column(type="integer")
     * @Id
     * @GeneratedValue(strategy="NONE")
     */
    protected $id;

    /**
     * @var integer
     *
     * @Column(type="integer")
     * @Id
     */
    protected $customer_id;

    /**
     * @var ArrayCollection
     *
     * @OneToMany(targetEntity="Course", mappedBy="subject")
     */
    private $courses;

    ...
}

コース:

class Course
{
    ...

    /**
     * @var Subject
     *
     * @ManyToOne(targetEntity="Subject", inversedBy="courses")
     * @JoinColumns({
     *   @JoinColumn(name="subject_id", referencedColumnName="id"),
     *   @JoinColumn(name="subject_customer_id", referencedColumnName="customer_id")
     * })
     */
    private $subject;
}

私は「subject_id」と「subject_customer_id」を持っています。私の問題は、これを書いたときに、科目に参加しないとコースを除外できないことです:

$this->em->createQuery("SELECT c FROM Course c WHERE c.subject = :subject")
    ->setParameters( array('subject' => array( 'subject_id' => $subject_id, 'subject_customer_id' => $subject_customer_id ) ) )
    ->getResult();

次のエラーが表示されます。

Doctrine\ORM\Query\QueryException [ 0 ]: 複合主キーを持つエンティティへの単一値の関連付けパス式はサポートされていません。クエリで複合主キーのコンポーネントに明示的に名前を付けます。

これを機能させることができる唯一の理由は、内部結合サブジェクトによるものです。例:

$this->em->createQuery("SELECT c FROM Course c INNER JOIN c.subject s WITH s.id = :subject AND s.customer_id = :customer")
    ->setParameters( array( 'subject' => $subject_id, 'customer' => $customer_id ) )
    ->getResult();

サブジェクトに参加せずに、サブジェクトの主キーに基づいてコースを取得する方法はありますか?

4

1 に答える 1

2

現在のところ、このロジックはDQL ではまだサポートされていません( https://github.com/doctrine/doctrine2/blob/2.3.2/lib/Doctrine/ORM/Persisters/BasicEntityPersister.php#L1641-L1643も参照) 。 .

次のようなものに参加する必要があります。

SELECT
    c
FROM
    Course c
INNER JOIN 
    c.subject s 
WHERE 
    s.id = :subject 
    AND 
    s.customer_id = :customer

最終的にそのようなロジックを追加することで、プロジェクトに貢献することを検討してください。新しい2.4シリーズにマージされる可能性があります。

于 2013-03-04T12:19:21.817 に答える