【问题标题】:Doctrine2 - Annotation - "findOneBy" on column in "OneToOne" joined tableDoctrine2 - 注释 - “OneToOne”连接表中的列上的“findOneBy”
【发布时间】:2015-09-18 18:22:16
【问题描述】:

使用 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;
}

页面本地化

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() 手动构建查询。但是,我觉得这种方法违背了拥有实体的目的。

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

【问题讨论】:

    标签: php join doctrine-orm annotations


    【解决方案1】:

    根据我目前收集到的信息,确实不可能使用EntityRepository 的任何“查找”方法跨多个实体(连接表)执行这样的搜索; findfindAllfindByfindOneBy

    Stackoverflow 对类似问题的回答:

    名单还在继续……

    结论

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

    想法

    我发现这个限制非常令人讨厌,并且在 Doctrine2 中存在严重的功能不足。

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

    Doctrine2 注意事项(有点题外话)

    我真的很想学习如何有效地使用和利用 Doctrine2。虽然 Doctrine2 确实有很多不错的功能,但它当然也包含一些巨大的钢筋墙,这些墙总是会面对面撞到。 Google 和 Stackoverflow 肯定有一堆“为什么我不能……?”与 Doctrine2 相关的问题,尤其是与表格相关的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-25
      • 2012-06-10
      • 1970-01-01
      • 1970-01-01
      • 2012-06-06
      • 2015-10-20
      • 2017-10-07
      相关资源
      最近更新 更多