Symfony2 — сохраняйте данные, используя отношение «многие ко многим»

Я использую Symfony2, и я создал отношение многие ко многим, используя эти объекты:

<?php
/** @Entity **/
class User
{
// ...

/**
* @ManyToMany(targetEntity="Group", inversedBy="users")
* @JoinTable(name="users_groups")
**/
private $groups;

public function __construct() {
$this->groups = new \Doctrine\Common\Collections\ArrayCollection();
}

// ...
}

/** @Entity **/
class Group
{
// ...
/**
* @ManyToMany(targetEntity="User", mappedBy="groups")
**/
private $users;

public function __construct() {
$this->users = new \Doctrine\Common\Collections\ArrayCollection();
}

// ...
}

Если я обновлю свою БД, я получу эту схему MySQL:

CREATE TABLE User (
id INT AUTO_INCREMENT NOT NULL,
PRIMARY KEY(id)
) ENGINE = InnoDB;
CREATE TABLE users_groups (
user_id INT NOT NULL,
group_id INT NOT NULL,
PRIMARY KEY(user_id, group_id)
) ENGINE = InnoDB;
CREATE TABLE Group (
id INT AUTO_INCREMENT NOT NULL,
PRIMARY KEY(id)
) ENGINE = InnoDB;
ALTER TABLE users_groups ADD FOREIGN KEY (user_id) REFERENCES User(id);
ALTER TABLE users_groups ADD FOREIGN KEY (group_id) REFERENCES Group(id);

Мне нужно знать, как я могу вставить пару в таблицу отношений под названием 'users_groups' чтобы представить связь между пользователем и группой.

Когда я хочу вставить данные в базу данных, я обычно пытаюсь сохранить эти данные, используя объект, связанный с таблицей БД, но в этом случае я не могу получить доступ к этому объекту, потому что таблица 'users_groups' был создан отношениями без класса Entity.

Заранее спасибо за помощь.

2

Решение

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

Как вы заметили, у вас нет доступа к средней таблице, а только к ее конечным точкам. Обратите внимание на User конструктор:

public function __construct() {
$this->groups = new \Doctrine\Common\Collections\ArrayCollection();
}

Он создал коллекцию (в основном список) объектов другой стороны отношения. Это способ управления средней таблицей — путем вставки объектов в коллекцию.

Попробуйте подумать об этом. Отношение N: M (которого вы пытаетесь достичь) — это не более чем набор Userс каждым из них, содержащим список Groups.

Итак, без лишних слов, это то, что вы должны быть в состоянии сделать:

$em = ... // instance of entity manager

$user = new User();

$g1 = new Group();
$g2 = new Group();

$user->getGroups()->add($g1);
$user->getGroups()->add($g2);

$em->persist($g1);
$em->persist($g2);
$em->persist($user);

$em->flush();

Есть много подробностей по этой теме, но я думаю, что вы сможете начать это прямо здесь. Надеюсь, поможет…

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]