Doctrine2 - Annotation - “OneOoBne”列中的“findOneBy”连接表

时间:2015-09-18 18:22:16

标签: php join doctrine-orm annotations

使用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 = 1Page.isActive = truePageLocalization.localeCode = "en-US"。这次搜索是如何进行的?

我的尝试不起作用。

$entityRepository->findOneBy([
  "id" => 1,
  "isActive" => true,
  "pageLocalization" => [
    "localeCode" => "en-US"
  ]
]);

我没有通过Google,Stackoverflow或Doctrine2文档找到答案。

我看到的最常见的解决方案是,人们愿意使用$entityManager->createQueryBuilder()手动构建查询。但是,我觉得这种做法违背了拥有实体的目的。

这种类型的搜索是否完全可以使用纯注释和实体?

1 个答案:

答案 0 :(得分:0)

从我迄今为止收集到的内容来看,确实可以使用任何EntityRepository的“查找”在多个实体(连接表)中执行此类搜索“ 方法; findfindAllfindByfindOneBy

Stackoverflow回答了类似的问题:

列表继续......

<强>结论

必须使用DQLQueryBuilder执行此类搜索。

<强>思想

我发现这种限制在Doctrine2中非常令人讨厌并且是一个严重的特征不足。

如果有一半时间,当我想要触摸数据库时,我必须自己构建查询,为什么我会烦恼并坚持两种截然不同的方法; (1)具有反映数据库表的实体的ORM和(2)通过DBAL构建纯SQL请求,例如, PDO或Doctrine的DQL?

Doctrine2注意事项(稍微偏离主题)

我真的想学习如何有效地使用和利用Doctrine2。虽然Doctrine2确实拥有一系列不错的功能,但它当然也包含了一些巨大的钢筋墙,这些墙一直在面对面。谷歌和Stackoverflow肯定有一堆“为什么我不能......?”与Doctrine2相关的问题,特别是加入表格。