原则连接和类表继承


Doctrine Join and Class Table Inheritance

我遇到了这个问题,在我周围没有人可以帮助我。所以我希望这里有人知道:

我正在使用下面的结构:

实体:MLT

/**
 * @Entity
 */
class MLT 
{
    /**
     * @OneToMany(targetEntity="'WAD'Common'LT", cascade={"remove"}, mappedBy="term")
     */
    private $languageTerms;  
}

实体:LT

/**
 * @Entity
 * @InheritanceType("JOINED")
 * @DiscriminatorColumn(name="discr", type="string")
 * @DiscriminatorMap({"lttext" = "LTText", "ltstring" = "LTString"})
 */
abstract class LT {
    /**
     * @Id @Column(type="integer")
     * @GeneratedValue
     */
    private $id;
    ...
}

那么我有两个相同类型的实体:LTString和LTText:

实体:LTText

/**
 * @Entity
 */
class LTText extends LT {
    /**
     * @Column(type="text")
     */
    private $value;
}

实体:LTString

/**
 * @Entity
 */
class LTText extends LT {
    /**
     * @Column(type="string")
     */
    private $value;
}

现在我的问题:

我正在创建以下连接:

$qb = $em->createQueryBuilder();
$qb->select('naam')
    ->from(''TBIT'Entities'Naam', 'naam') //this is the MLT
    ->leftjoin('naam.languageTerms','lts') //these are the LT's
    ->orwhere($qb->expr()->like('lts.value',"'%".$word."%'"));

最后一行给我带来了麻烦。它给出的错误是它没有一个值字段。这是真的,因为子类有它。但如何让查询自动包含子类呢?

您是否尝试将$value字段置于LT类作为protected访问:

class LTText extends LT {
    /**
     * @Id @Column(type="integer")
     * @GeneratedValue
     */
     private $id;
    /**
     * @Column(type="string")
     */
     private $value;
}

因此,如果您需要将$value设置为不同的数据类型,只需在子类中重写它。

我发现我可以使用子查询来解决这个问题。类似以下语句:

$qb->select('naam')
    ->from(''TBIT'Entities'Naam', 'naam') //this is the MLT
    ->where(
        'naam.languageTerms in (SELECT lts FROM [class] lts'
            .' WHERE ' . $qb->expr()->like('lts.value',"'%".$word."%'")
        .')'
    );