我正在用教条遇到这个问题,在我周围没有人可以帮助我解决这个问题。所以我希望有人知道它:
我使用以下结构:
实体: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没有值字段的错误。这是真的,因为子类有它。但是如何让查询自动包含子类?
答案 0 :(得分:0)
您是否尝试将$value
字段设置为LT
类protected
访问权限:
class LTText extends LT {
/**
* @Id @Column(type="integer")
* @GeneratedValue
*/
private $id;
/**
* @Column(type="string")
*/
private $value;
}
因此,如果您需要将$value
设置为不同的数据类型,只需在子类中重写它。
答案 1 :(得分: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."%'")
.')'
);