1

我在教义上遇到了这个问题,而我周围的任何人都无法帮助我解决这个问题。所以我希望这里有人知道:

我正在使用以下结构:

实体: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."%'"));

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

4

2 回答 2

0

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

$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."%'")
        .')'
    );
于 2014-07-10T10:44:51.640 回答
0

您是否尝试将$value字段放在LT类中作为protected访问权限:

class LTText extends LT {

    /**
     * @Id @Column(type="integer")
     * @GeneratedValue
     */
     private $id;

    /**
     * @Column(type="string")
     */
     private $value;

}

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

于 2013-05-28T15:22:55.860 回答