使用Doctrine2,我试图在一个实体上执行findOneBy
,我在那里使用OneToOne
加入了一个表,我想在连接表中搜索列。
正在使用的两个PHP实体(简化版):
网页:
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity
* @ORM\Table(name="Page")
* @ORM\HasLifecycleCallbacks()
*/
class Page extends EntityInterface
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\Column(type="boolean")
*/
public $isActive;
/**
* @ORM\OneToOne(targetEntity="\PageLocalization")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="id", referencedColumnName="pageId")
* })
**/
public $pageLocalization;
}
PageLocalization :
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity
* @ORM\Table(name="PageLocalization")
* @ORM\HasLifecycleCallbacks()
*/
class PageLocalization extends EntityInterface
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
*/
public $pageId;
/**
* @ORM\Column(type="string")
*/
public $localeCode;
/**
* @ORM\Column(type="string")
*/
public $title;
}
实体工作,我可以很好地提取数据,例如$entityRepository->findOneBy(["id"=>1])
。
现在,例如,我想搜索Page.id = 1
,Page.isActive = true
和PageLocalization.localeCode = "en-US"
。这次搜索是如何进行的?
我的尝试不起作用。
$entityRepository->findOneBy([
"id" => 1,
"isActive" => true,
"pageLocalization" => [
"localeCode" => "en-US"
]
]);
我没有通过Google,Stackoverflow或Doctrine2文档找到答案。
我看到的最常见的解决方案是,人们愿意使用$entityManager->createQueryBuilder()
手动构建查询。但是,我觉得这种做法违背了拥有实体的目的。
这种类型的搜索是否完全可以使用纯注释和实体?
答案 0 :(得分:0)
从我迄今为止收集到的内容来看,确实不可以使用任何EntityRepository
的“查找”在多个实体(连接表)中执行此类搜索“ 方法; find
,findAll
,findBy
和findOneBy
。
Stackoverflow回答了类似的问题:
列表继续......
<强>结论强>
必须使用DQL或QueryBuilder
执行此类搜索。
<强>思想强>
我发现这种限制在Doctrine2中非常令人讨厌并且是一个严重的特征不足。
如果有一半时间,当我想要触摸数据库时,我必须自己构建查询,为什么我会烦恼并坚持两种截然不同的方法; (1)具有反映数据库表的实体的ORM和(2)通过DBAL构建纯SQL请求,例如, PDO或Doctrine的DQL?
Doctrine2注意事项(稍微偏离主题)
我真的想学习如何有效地使用和利用Doctrine2。虽然Doctrine2确实拥有一系列不错的功能,但它当然也包含了一些巨大的钢筋墙,这些墙一直在面对面。谷歌和Stackoverflow肯定有一堆“为什么我不能......?”与Doctrine2相关的问题,特别是加入表格。