2014-01-04 4 views
0

Я пытаюсь добавить сущности и отношения Doctrine к моей существующей схеме базы данных, но у меня возникают некоторые проблемы.Doctrine ManyToMany вопросы проблем

У меня есть 4 таблицы:

+-------------+ +-----------+ +-----------------+ +-------------------+ 
| customers | | acl_roles | | acl_permissions | | acl_customer_role | 
--------------- ------------- ------------------- --------------------- 
| customer_id | | id  | | role_id   | | customer_id  | 
+-------------+ | name  | | resource_id  | | acl_role_id  | 
       +------------ | flags   | +-------------------- 
           +------------------ 

В моих ACL клиенты могут иметь множество ролей и каждая роль может иметь много разрешений. Отображение клиентов/роли выполняется через таблицу acl_customer_role.

У меня в настоящее время возникают проблемы, связанные с этим отношением. Это мои структуры (удалены некоторые стандартные аннотации для краткости):

class Customer { 

    /** 
    * @ORM\ManyToMany(targetEntity="AclRole", cascade="persist") 
    * @ORM\JoinTable(name="acl_customer_role", 
    * joinColumns={@ORM\JoinColumn(name="acl_role_id", referencedColumnName="customer_id")} 
    *) 
    */ 
    protected $roles; 

} 

class AclRole { 

    /** 
    * @ORM\Column(name="id", type="integer", nullable=false) 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="IDENTITY") 
    */ 
    protected $id; 

} 

Как вы можете видеть, в моей сущности клиента я определение $roles. Это отношения ManyToMany, поскольку многие роли могут принадлежать многим клиентам. Я настраиваю свою таблицу соединений как acl_customer_role, и я указываю столбцы, в которых должно быть соединение. Тем не менее, я получаю следующее сообщение об ошибке:

PHP Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42S22]: Column not found: 1054 Unknown column 'acl_customer_role.aclrole_id' in 'on clause'' in vendor/doctrine/dbal/lib/Doctrine/DBAL/Connection.php:641 

Это кажется, что запрос доктрины является пытается присоединиться на 'acl_customer_role.aclrole_id', которые, очевидно, не существует.

Как я могу правильно определить отношения?

UPDATE:

Почему-то кажется, что доктрина модифицирует свое имя столбца. Когда я укажу acl_role_id, Doctrine вычеркивает первый знак подчеркивания и предполагает, что имя столбца равно aclrole_id (как показано в сообщении об ошибке в вопросе выше). Однако, когда я добавляю два символа подчеркивания, такие как acl__role_id, он оставляет все подчеркивания там и дает почти такую ​​же ошибку, кроме того, что теперь он не может присоединиться к acl__role_id.

Я довольно много в недоумении ..

ответ

2

Я знаю, этот вопрос старый, но недавно я наткнулся на одной и той же ошибки/проблемы, и я нашел решение.

По умолчанию Doctrine использует класс DefaultNamingStrategy для генерации, например. joinColumn, joinTableName, propertyToColumnName имена:

... 
public function joinColumnName($propertyName) 
{ 
    return $propertyName . '_' . $this->referenceColumnName(); 
} 

Вот почему в вашем случае был создан aclrole_id столбец.

Чтобы изменить это поведение все, что вам нужно сделать, это изменить именования стратегии Doctrine2, чтобы подчеркнуть в вас приложение/config.yml файла:

doctrine: 

    orm: 
     # ... 
     naming_strategy: doctrine.orm.naming_strategy.underscore 

UnderscoreNamingStrategy класса

... 
public function joinColumnName($propertyName) 
{ 
    return $this->underscore($propertyName) . '_' . $this->referenceColumnName(); 
} 

Это будет генерировать : acl_role_id

Вы также можете реализовать собственную стратегию именования: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/namingstrategy.html

Примечание: Это было введено в версии 2.3.

Смежные вопросы