【问题标题】:Doctrine2: how to solve left join not being generatedDoctrine2:如何解决未生成左连接
【发布时间】:2011-12-07 09:21:21
【问题描述】:

考虑这两个实体:

/** @Entity  */
class String {
    /** @Id @Column(type="integer")
     * @GeneratedValue
     */
    public $id;

    /** @Column(length=255) */
    public $name;

    /**
     * @OneToMany(targetEntity="StringTranslation", mappedBy="owner") */
    public $translations;
}

/** @Entity */
class StringTranslation {
    /** @Id @Column(type="integer")
     * @GeneratedValue
     */
    public $id;

    /* @ManyToOne(targetEntity="String", inversedBy="translations")
     * @JoinColumn(name="foreignId", referencedColumnName="id") */
    public $owner;

    /** @Column(length=2) */
    public $lang;

    /** @Column(length=255) */
    public $translation;
}

当我得到查询时使用

$query = qb()->select(array('s', 't'))
    ->from('String', 's')
    ->leftJoin('s.translations', 't')
    ->getQuery()
    ->getSQL();

我得到这个结果:

SELECT s0_.id AS id0, s0_.name AS name1, s1_.id AS id2, s1_.foreign_id AS foreign_id3, s1_.lang AS lang4, s1_.translation AS translation5 FROM 字符串 s0_ LEFT JOIN

为什么没有生成左连接?

当我尝试使用

获取查询结果时
$query = qb()->select(array('s', 't'))
    ->from('String', 's')
    ->leftJoin('s.translations', 't')
    ->getQuery()
    ->getArrayResult();

出现此错误:

致命错误:带有消息的未捕获异常“PDOException” 'SQLSTATE[42000]: 语法错误或访问冲突:1064 你有一个 SQL 语法错误

如何解决这个问题?

【问题讨论】:

  • 您是否使用orm:validate-schema 验证了您的架构?
  • 我是学说新手,所以我想知道如何运行orm:validate schema。当我使用 Schematool 生成 schemasql 时,它输出 array( [0] => 'CREATE TABLE String (id INT AUTO_INCREMENT NOT NULL, name VARCHAR(255) NOT NULL, PRIMARY KEY(id)) ENGINE = InnoDB' [1] => 'CREATE TABLE StringTranslation (id INT AUTO_INCREMENT NOT NULL, lang VARCHAR(2) NOT NULL, translation LONGTEXT NOT NULL, PRIMARY KEY(id)) ENGINE = InnoDB' ) StringTranslation 中的 foreignId 列似乎丢失了,即使我在 de JoinColumn 注释中指定了它

标签: doctrine-orm


【解决方案1】:

找到了!这一切都归结为一个错字。注释必须以/** 开头,而不是/*。换行

/* @ManyToOne(targetEntity="String", inversedBy="translations")

/** @ManyToOne(targetEntity="String", inversedBy="translations")

解决了问题!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-19
    • 1970-01-01
    • 2018-11-19
    • 1970-01-01
    • 2014-07-29
    • 2022-01-20
    • 2012-02-02
    • 1970-01-01
    相关资源
    最近更新 更多