У меня проблема с отображением сущности доктрины. У меня есть базовая сущность пользователя, и я хочу создать сущность Друга, состоящую из двух внешних ключей к пользовательской таблице, первого владельца дружбы и другого. Я пытался сделать это таким образом (yaml), сущности генерируются правильно, но когда я создаю БД с обновлением схемы доктрины, это дает совершенно другой результат.

Пользовательский объект:

..\..\Entity\User:
type:  entity
uniqueConstraints:
    usernameCanonical:
        columns: usernameCanonical
    emailCanonical:
        columns: emailCanonical
oneToMany:
    owners:
        targetEntity: Friend
        mappedBy: owner
    friends:
        targetEntity: Friend
        mappedBy: friend

И дружественная сущность:

..\..\Entity\Friend:
type: entity
table: friend
lifecycleCallbacks:
    prePersist: [setCreated, setModified]
    preUpdate: [setModified]
manyToOne:
    owner:
        targetEntity: User
        inversedBy: friends
        joinColumn:
            name: user
            referencedColumnName: id
            onDelete: cascade
    friend:
        targetEntity: User
        inversedBy: owners
        joinColumn:
            name: user
            referencedColumnName: id
            onDelete: cascade

Это должно создать два чужих для от друга к пользователю, но вместо этого создать один, например:

ALTER TABLE friend ADD CONSTRAINT FK_55EEAC618D93D649 FOREIGN KEY (user) REFERENCES users (id) ON DELETE CASCADEe
0
ghostika 29 Май 2013 в 01:51
Мне не очень понятно, что вы хотите делать. Что вы хотите от своего друга? Не могли бы вы использовать саморегуляцию многие ко многим в своей пользовательской сущности?
 – 
copndz
30 Май 2013 в 20:36
В основном сопоставляйте 2 пользовательских объекта вместе, но мне понравилось не использовать сопоставление, а только два значения int без какого-либо внешнего ключа
 – 
ghostika
31 Май 2013 в 01:56
Вам следует взглянуть на документацию доктрины (ManyToMany Self-referencing): docs.doctrine-project.org/en/2.0.x/reference/…
 – 
copndz
31 Май 2013 в 11:44
Хм, я думаю, это именно то, что мне нужно, я могу разобрать это позже. Я помню, как читал эту страницу, но не видел в этом смысла. Добавьте в качестве ответа, потому что я думаю, что это решение.
 – 
ghostika
31 Май 2013 в 14:05

1 ответ

Лучший ответ

Общие отношения «Друзья» - это отношения доктрины ManyToMany SelfReferencing, которые используются в качестве примера в документация по доктрине

2
copndz 31 Май 2013 в 14:11
Спасибо большое, отлично. Один быстрый вопрос, знаете ли вы, может быть, я могу расширить "таблицу друзей" другим полем, например createdAt? или потому что это не совсем сущность, я не могу?
 – 
ghostika
1 Июн 2013 в 15:03
Если вы хотите это сделать, это не отношения «многие-многие-многие», а «один-многие-многие-один». Вы должны создать объект FriendUser с двумя объектами User в качестве первичного составного ключа и всеми необходимыми атрибутами.
 – 
copndz
1 Июн 2013 в 16:44
Хм, тогда я не понимаю, почему мой исходный код не работал, потому что у меня есть пользователь и друг, что вы предложили.
 – 
ghostika
1 Июн 2013 в 22:16