MySQL — PHP Doctrine 2 — Как автоматически сохранять отношения «Один ко многим» с опциями каскадирования

Я не могу сохранить отношения в Doctrine 2 с Cascade.
В моем приложении компьютеры имеют много действий, а действие может принадлежать множеству разных компьютеров. Но у меня также есть дополнительный атрибут Active, чтобы указать, какие действия будут активными. на компьютер.

Мои таблицы следующие:

CREATE TABLE IF NOT EXISTS computers (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL UNIQUE,
os VARCHAR(30) NOT NULL,
date_creation TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
date_modification TIMESTAMP,
online BOOLEAN NOT NULL DEFAULT FALSE,
id_user_creation INT,
id_user_modification INT DEFAULT NULL,

CONSTRAINT fk_users_computers_creation FOREIGN KEY (id_user_creation) REFERENCES users(id),
CONSTRAINT fk_users_computers_modification FOREIGN KEY (id_user_modification) REFERENCES users(id)
);

CREATE TABLE IF NOT EXISTS actions (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL UNIQUE,
description TEXT,
date_creation TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
date_modification TIMESTAMP,
id_user_creation INT NOT NULL,
id_user_modification INT DEFAULT NULL,

CONSTRAINT fk_users_actions_creation FOREIGN KEY (id_user_creation) REFERENCES users(id),
CONSTRAINT fk_users_actions_modification FOREIGN KEY (id_user_modification) REFERENCES users(id)
);

CREATE TABLE IF NOT EXISTS computers_actions (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
id_computer INT NOT NULL,
id_action INT NOT NULL,
active BOOLEAN NOT NULL DEFAULT FALSE,

CONSTRAINT fk_computers FOREIGN KEY (id_computer) REFERENCES computers(id),
CONSTRAINT fk_actions FOREIGN KEY (id_action) REFERENCES actions(id)
);

Приведенный выше код является лишь частью моего сценария базы данных, который затронул мою текущую проблему.
Мои сущности следующие:

Компьютерная сущность:

/**
* @var ArrayCollection
* @OneToMany(targetEntity="ComputerAction", mappedBy="computer", cascade={"persist"})
*/
private $actions;

public function __construct()
{
$this->actions = new ArrayCollection();
}

Объект действия:

/**
* @var ArrayCollection
* @OneToMany(targetEntity="ComputerAction", mappedBy="action", cascade={"persist"})
*/
private $computers;

public function __construct()
{
$this->computers = new ArrayCollection();
}

Отношения, ComputerAction Entity.
Мне нужен атрибут в этих отношениях, поэтому я не использовал аннотацию ManyToMany.
В этом случае у компьютера есть много ComputerAction, а у ComputerAction есть только один компьютер. То же самое происходит с действием.

/**
* @var Computer
* @ManyToOne(targetEntity="Computer", inversedBy="actions", cascade={"persist"})
* @JoinColumn(name="id_computer", referencedColumnName="id")
*/
private $computer;

/**
* @var Action
* @ManyToOne(targetEntity="Action", inversedBy="computers", cascade={"persist"})
* @JoinColumn(name="id_action", referencedColumnName="id")
*/
private $action;

/**
* @var boolean
* @Column(type="boolean")
*/
private $active;

Эти атрибуты имеют свои собственные методы получения и установки, и, как вы можете заметить, атрибуты OneToMany имеют тип Doctrine ArrayCollection.

Добавление Действия мои компьютеры выполняется в действии Добавить из ComputerController, которое следует ниже:

// ComputerController, action add

$computer->setName($post['name']);
$computer->setOs($post['os']);
$computer->setOnline(false);
$computer->setUserOwner($this->getUserService()->find($this->retrieveUser()['id']));

foreach($post['action'] as $id_action) {
$relation = new ComputerAction();
$relation->setAction($this->getActionService()->find($id_action));
$relation->setComputer($computer);
$computer->setActions($relation);
}

if($computer = $this->getComputerService()->save($computer)) {
$this->setMessage(sprintf('Computer [%s] added successfully!', $computer->getName()), MessageSkin::SUCCESS);
} else {
$this->setMessage('The Computer could not be added. Try again later.', MessageSkin::DANGER);
}

В представлении «Добавить компьютер» у меня есть «Выбрать несколько с идентификаторами действий». Я получаю эти идентификаторы, и в цикле я создаю новый ComputerAction, устанавливая атрибут $ action в качестве объекта действия, который содержит этот идентификатор. Затем я устанавливаю текущий компьютер в атрибуте $ computer, и, наконец, я добавляю этот экземпляр ComputerAction в коллекцию $ actions ArrayCollection внутри Computer Entity.

Проблема заключается в следующем: почему объекты ComputerAction не сохраняются?

Я пробовал много разных подходов с опциями Cascade, но безуспешно. Пожалуйста помоги!

Спасибо!

Siipe

0

Решение

Вы должны помнить, что в любых отношениях Doctrine имеет основную сущность и сопоставленную сущность (подчиненную сущность) в отношениях. Речь идет об отношениях OneToOne, OneToMany, ManyToMany и других. Вы не можете сохранить основной объект из подчиненного объекта, что бы вы ни написали.

Это может помочь вам, возможно.

0

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

Я решил свою проблему, установив для атрибута $ active значение «false», поскольку он не может быть нулевым в базе данных. Я действительно не знаю, почему это произошло, так как это ЛОЖЬ ПО УМОЛЧАНИЮ в базе данных. Доктрина просто не предупредила меня и не сообщила об ошибке.

0

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