【问题标题】:Doctrine- one of associations doesn't work proper教义-协会之一不能正常工作
【发布时间】:2013-12-17 12:21:28
【问题描述】:

我对教义 2 中的关联有疑问 我有两个看起来一样的关联。一个工作正常,第二个工作方式很奇怪。稍后我会解释。

这是我的主要实体 - 产品:

**
 * Product
 *
 * @ORM\Table(name="product", indexes={
 *      @ORM\Index(name="category_index", columns={"category_id"}),
 *      @ORM\Index(name="partner_index", columns={"partner_id"})
 * })
 * @ORM\Entity
 */
class Product
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=255, nullable=false)
     */
    private $name;

    /**
     * @var Category
     *
     * @ORM\ManyToOne(targetEntity="Category")
     * @ORM\JoinColumn(name="category_id", referencedColumnName="id")
     */
    private $categoryId;

    /**
     * @var Partner
     *
     * @ORM\ManyToOne(targetEntity="Partner")
     * @ORM\JoinColumn(name="partner_id", referencedColumnName="id")
     */

    private $partnerId;
}

类别实体:

/**
 * Category
 *
 * @ORM\Table(name="category")
 * @ORM\Entity
 */
class Category
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="category_name", type="string", length=100, nullable=false)
     */
    private $categoryName;
}

合作伙伴实体:

/**
 * Partner
 *
 * @ORM\Table(name="partner")
 * @ORM\Entity
 */
class Partner
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=150, nullable=false)
     */
    private $name;
}

如您所见,我有两个相同的关联:
产品#categoryId
产品#partnerId

第一个- categoryId 可以正常工作,但第二个- partnerId 不能:

我注意到的第一件事是 Doctrine 使用合作伙伴实体创建代理类, 而类别实体不需要代理类来工作,所以其中之一 这不能正常工作。我刚从教义开始,所以我可能会 错了。

我在合作伙伴表中有 4 条记录。当我尝试修改产品时 手动记录,在partner_id字段我不能设置1-4,我可以设置 像这样:

(empty)
1 - 1
2 - 2
3 - 3
4 - 4
(empty)
1 - 1
2 - 2
3 - 3
4 - 4

我第一次看到这样的东西。

我注意到的最后一件事:

$query = $em->createQuery('
    SELECT pp.name, p.id
    FROM Application\Entity\Product AS p
    LEFT JOIN Application\Entity\Partner AS pp WITH p.partner_id = pp.id GROUP by p.partner_id
');
$items = $query->getResult();

显示错误:

Doctrine\ORM\Query\QueryException: [Semantical Error] line 0, col 148 near 'partner_id =': Error: Class Application\Entity\Product has no field or association named partner_id in

感谢任何帮助和提示。

编辑
所以,问题是。为什么 Doctrine 为 Partner Entity 创建代理类,而不为 Category 创建代理类?

【问题讨论】:

    标签: orm doctrine-orm doctrine


    【解决方案1】:

    据我所知,Doctrine 只会在使用其所属实体的功能时创建代理。

    您也可以使用命令行工具手动生成代理。

    关于错误: 您应该使用 partnerId 而不是 partner_id。 Partner_id 是您的数据库列的名称,而不是您的 Product 实体中定义的属性的名称。

    $query = $em->createQuery('
        SELECT pp.name, p.id
        FROM Application\Entity\Product AS p
        LEFT JOIN Application\Entity\Partner AS pp WITH p.partnerId = pp.id GROUP by p.partnerId
    ');
    $items = $query->getResult();
    

    仔细查看 DQL 文档: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/dql-doctrine-query-language.html

    也许它会给你一些关于 SQL 和 DQL 之间区别的额外见解。

    【讨论】:

      猜你喜欢
      • 2019-12-27
      • 1970-01-01
      • 2015-06-13
      • 1970-01-01
      • 1970-01-01
      • 2020-04-18
      • 1970-01-01
      • 2013-03-30
      • 2010-11-30
      相关资源
      最近更新 更多