3

doctrine2 エンティティークラスを作成しGroup、テーブル名を引用しました:

/**
 * models\Entity\Group
 *
 * @ORM\Entity(repositoryClass="models\Repository\GroupRepository")
 * @ORM\Table(name="`group`", indexes={@ORM\Index(name="admin", columns={"`admin`"})})
 */
class Group
{

しかし、教義は各クエリでテーブル名を引用していないようです。最後の 2 つのクエリを実行するとdoctrine orm:schema-tool:update --dump-sql、エスケープされません。

ALTER TABLE group DROP FOREIGN KEY FK_6DC044C5814666E9;
ALTER TABLE group ADD CONSTRAINT FK_6DC044C5814666E9 FOREIGN KEY (`admin`) REFERENCES `user` (`id`)

ここで何か間違ったことをしていますか?

編集

とりあえず交換した

    if ($table instanceof Table) {
        $table = $table->getQuotedName($this);
    }

これで

    if ($table instanceof Table) {
        $table = $table->getQuotedName($this);
    } /* Start hack */ else if (0 !== strpos($table, '`'))
        $table = "`$table`"; /* End hack */

\Doctrine\DBAL\Platforms\AbstractPlatform::getCreateForeignKeySQL()とでgetDropForeignKeySQL()。しかし、もちろん、それは…ええと…非常に良い解決策ではありません。

4

1 に答える 1

0

私も似たような状況です。ただし、元のバグは修正されているようです。

ランニング:

./vendor/bin/doctrine-module orm:schema:create --dump-sql

これは正しい SQL です。

ALTER TABLE groups_user ADD CONSTRAINT FK_F0F44878A76ED395 FOREIGN KEY (user_id) REFERENCES User (id);
ALTER TABLE groups_user ADD CONSTRAINT FK_F0F44878FE54D947 FOREIGN KEY (group_id) REFERENCES `group` (id);

上記のテーブル名は適切にエスケープされています。

でも

後でそのテーブルからSELECTしようとすると、エラーが発生します。

function getGroupByName($name)
{
    $em = $this->getEntityManager();
    $criteria = array('name' => $name);
    return $em->getRepository('Module\Entity\Group')
        ->findOneBy($criteria);
}

スロー:

An exception occurred while executing 'SELECT t0.id AS id1, t0.name AS name2 FROM group t0 WHERE t0.name = ? LIMIT 1' with params ["The Group Name"]:

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'group t0 WHERE t0.name = 'The Group Name' LIMIT 1' at line 1

上記のようにFROM group t0 WHERE、テーブル名ではエスケープする必要がありますが、そうではありません。

私のばかげた解決策は、すべてのエンティティ名を同じに保ち、ORM 注釈を更新して複数の「グループ」を使用することでした。

モジュール\エンティティ\グループ内

/**
 * @ORM\Table(name="groups")
 */

Module\Entity\User 内

/**
 * @ORM\ManyToMany(targetEntity="Module\Entity\Group", inversedBy="users")
 * @ORM\JoinTable(
 *     name="groups_user",
 *     joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id", nullable=false)},
 *     inverseJoinColumns={@ORM\JoinColumn(name="group_id", referencedColumnName="id", nullable=false)}
 * )
 */
private $groups;

これは純粋主義者向けではありませんが、Doctrine をハッキングしないことを意味し、エンティティ名は同じままにすることができます。

于 2014-08-26T17:00:57.653 に答える