Доктрина Symfony - во многих отношениях, почему патч работает в одном направлении, а не в другом - PullRequest
0 голосов
/ 03 мая 2018

Я нахожусь в проекте, где у меня есть много-много отношений между командой и агентом. Потому что в моих командах может быть несколько агентов, а в моих агентах может быть несколько команд.

Я нахожусь в ситуации, когда я делаю патч, чтобы я мог добавить несколько агентов в команду (которая работает), но я не могу сделать рабочий патч, чтобы добавить несколько команд к агенту.

Это из-за того, что отображено и перевернуто?

UPDATE

В моей TEAM сущности есть отношение

/**
 * @ORM\ManyToMany(targetEntity="MyBundle\Entity\Agent", inversedBy="teams")
 */
private $agents;

Вот отношение в моем АГЕНТЕ сущности

/**
 * @ORM\ManyToMany(targetEntity="MyBundle\Entity\Team", mappedBy="agents")
 */
private $teams;

В контроллере моей команды, когда я хочу дать своей команде новых агентов, я использую этот фрагмент кода, и он работает. Я вижу все агенты, связанные с командой в базе данных.

$team->setAgents($theAgents);

Но когда я хочу сделать обратное в моем контроллере агента (назначая несколько команд новому агенту), агент создается в базе данных, но не назначается ни одной команде в таблице ассоциации. Даже если я использую это: $agent->setTeams($theTeams);

Следовательно, возможно, потому что это невозможно с Доктриной? Или, может быть, я что-то упустил.

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

В конце концов решение, которое я нашел, похоже на Jannes '.

В моей сущности агента я добавил эту функцию:

 /**
 * @param mixed $team
 */
public function addTeam(Team $team)
{
    $this->teams[] = $team;
    $team->addAgent($this);
}

и в контроллере моего агента:

$teams = $request->get('teams');
foreach ($teams as $team){
   $myTeam = $em->getRepository('MyBundle:Team')
            ->find($team["id"]);
   $agent->addTeam($myTeam);
}

Таким образом, я смог создать рабочий пост с обеих сторон! Еще раз всем спасибо за помощь!

0 голосов
/ 03 мая 2018

Это ожидаемое поведение .

Для связи с ManyToMany у вас есть сторона владения :

/**
 * @ORM\ManyToMany(targetEntity="MyBundle\Entity\Agent", inversedBy="teams")
*/
private $agents;

и обратная сторона :

/**
 * @ORM\ManyToMany(targetEntity="MyBundle\Entity\Team", mappedBy="agents")
*/
private $teams;

, которые определяются настройками inversedBy и mappedBy соответственно.

Для отношения ManyToMany вы можете выбрать, какой объект является владельцем и какую обратную сторону можно определить любой из них.

Doctrine проверяет только сторону владельца на наличие изменений в ассоциации. Проверьте Работа с ассоциациями , что означает, что в вашем случае проверяется только $ агентов Команд на наличие изменений в базе данных.

В агентах любые изменения в командах игнорируются.

Изменения, внесенные только в обратную сторону ассоциации, игнорируются. Обязательно обновите обе стороны двунаправленной ассоциации (или, по крайней мере, сторону-владельца, с точки зрения Doctrine)

Вы несете ответственность за внесение этих изменений также на стороне владельца.

Итак, в setTeams сделайте что-то вроде:

public function setTeams($teams) {
    $this->teams = $teams;
    foreach($teams as $team) {
        $team->addAgent($this);
    }
}

Обратите внимание, что в addAgent вы должны проверить, существует ли агент в коллекции.

...