教义 - 其中一个协会不起作用



我对条令2中的关联有问题我有两个相似的联想。一个工作得很好,第二个工作方式很奇怪。我稍后再解释。

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

**
 * Product
 *
 * @ORMTable(name="product", indexes={
 *      @ORMIndex(name="category_index", columns={"category_id"}),
 *      @ORMIndex(name="partner_index", columns={"partner_id"})
 * })
 * @ORMEntity
 */
class Product
{
    /**
     * @var integer
     *
     * @ORMColumn(name="id", type="integer", nullable=false)
     * @ORMId
     * @ORMGeneratedValue(strategy="IDENTITY")
     */
    private $id;
    /**
     * @var string
     *
     * @ORMColumn(name="name", type="string", length=255, nullable=false)
     */
    private $name;
    /**
     * @var Category
     *
     * @ORMManyToOne(targetEntity="Category")
     * @ORMJoinColumn(name="category_id", referencedColumnName="id")
     */
    private $categoryId;
    /**
     * @var Partner
     *
     * @ORMManyToOne(targetEntity="Partner")
     * @ORMJoinColumn(name="partner_id", referencedColumnName="id")
     */
    private $partnerId;
}

类别实体:

/**
 * Category
 *
 * @ORMTable(name="category")
 * @ORMEntity
 */
class Category
{
    /**
     * @var integer
     *
     * @ORMColumn(name="id", type="integer", nullable=false)
     * @ORMId
     * @ORMGeneratedValue(strategy="IDENTITY")
     */
    private $id;
    /**
     * @var string
     *
     * @ORMColumn(name="category_name", type="string", length=100, nullable=false)
     */
    private $categoryName;
}

合作伙伴实体:

/**
 * Partner
 *
 * @ORMTable(name="partner")
 * @ORMEntity
 */
class Partner
{
    /**
     * @var integer
     *
     * @ORMColumn(name="id", type="integer", nullable=false)
     * @ORMId
     * @ORMGeneratedValue(strategy="IDENTITY")
     */
    private $id;
    /**
     * @var string
     *
     * @ORMColumn(name="name", type="string", length=150, nullable=false)
     */
    private $name;
}

正如你所看到的,我有两个相同的关联:
产品#categoryId
产品#partnerId

第一个categoryId正常工作,但第二个partnerId不正常:

我注意到的第一件事是Doctrine使用Partner Entity创建代理类,而Category Entity不需要代理类来工作,因此这不正常工作。我刚开始学习教义,所以我可能错误的

我在Partner表中有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 ApplicationEntityProduct AS p
    LEFT JOIN ApplicationEntityPartner AS pp WITH p.partner_id = pp.id GROUP by p.partner_id
');
$items = $query->getResult();

显示错误:

DoctrineORMQueryQueryException: [Semantical Error] line 0, col 148 near 'partner_id =': Error: Class ApplicationEntityProduct has no field or association named partner_id in

感谢您的帮助和提示。

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

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

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

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

$query = $em->createQuery('
    SELECT pp.name, p.id
    FROM ApplicationEntityProduct AS p
    LEFT JOIN ApplicationEntityPartner 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之间的区别有一些额外的见解。

相关内容

  • 没有找到相关文章

最新更新