Доктрина `` многие к одному ко многим '', сохраняется только с одной стороны

У меня есть система с двумя таблицами и таблицей соединения. У Реуньяо много сервидоров, а у сервидоров много Реуньяо. Для этого у меня есть таблица reuniao, таблица servidor и таблица reuniaoservidor. Я хочу сохранить reuniao со многими существующими сервидорами, но я не хочу сохранять сервидор, когда reuniao сохраняется. Проблема в... Когда я пытаюсь упорствовать, доктрина воссоединения говорит мне:

"Новая сущность была обнаружена через связь 'SistemaIfnmg \ Entity \ Reuniao # servidores', которая не была настроена для каскадного сохранения операций для объекта: SistemaIfnmg \ Entity \ ReuniaoServidor @ 000000006a69473200007f33ddb737e2. Чтобы решить эту проблему явно: Eitheranly на этом неизвестном объекте или настройте каскад, сохраните эту ассоциацию в сопоставлении, например, @ManyToOne (.., cascade = {"persist"}). Если вы не можете узнать, какой объект вызывает проблему, реализуйте 'SistemaIfnmg \ Entity \ ReuniaoServidor #__ toString ( ) ', чтобы получить подсказку ".

Entyties:

Reuniao.php

namespace SistemaIfnmg\Entity;
use SistemaIfnmg\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
 * @ORM\Entity
 * @ORM\Table(name = "reuniao")
 * @ORM\HasLifecycleCallbacks()
 */
class Reuniao
{
/**
 * @ORM\Id
 * @ORM\Column(type = "integer")
 * @ORM\GeneratedValue(strategy = "AUTO")
 */
private $id;

/**
 * @ORM\Column(type = "string", length=255)
 */
private $titulo;
/**
 * @ORM\Column(type = "string", length=255)
 */
private $descricao;
/**
 * @ORM\Column(type = "datetime")
 */
private $data;

/**
 * @ORM\OneToMany(targetEntity = "SistemaIfnmg\Entity\ReuniaoServidor", mappedBy = "reuniaofk")
 */
private $servidores;

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

/**
 * Get id
 *
 * @return integer
 */
public function getId()
{
    return $this->id;
}

/**
 * @param int $id
 */
public function setId($id)
{
    $this->id = $id;
}

/**
 * @return string
 */
public function getTitulo()
{
    return $this->titulo;
}

/**
 * @param string $titulo
 */
public function setTitulo($titulo)
{
    $this->titulo = $titulo;
}

/**
 * @return string
 */
public function getDescricao()
{
    return $this->descricao;
}

/**
 * @param string $descricao
 */
public function setDescricao($descricao)
{
    $this->descricao = $descricao;
}

/**
 * @return string
 */
public function getData()
{
    return $this->data;
}

/**
 * @param string $data
 */
public function setData($data)
{
    $this->data = $data;
}

/**
 * Add servidores
 * @param \SistemaIfnmg\Entity\ReuniaoServidor $servidor
 * @return Reuniao
 */
public function addServidor(\SistemaIfnmg\Entity\ReuniaoServidor $servidor){
    $this->servidores[] = $servidor;
}

/**
 * Remove servidor
 *
 * @param \SistemaIfnmg\Entity\ReuniaoServidor $servidor
 */
public function removeServidor(\SistemaIfnmg\Entity\ReuniaoServidor $servidor){
    $this->servidores->removeElement($servidor);
}

/**
 * Get servidores
 *
 * @return \Doctrine\Common\Collections\Collection
 */
public function getServidores(){
    return $this->servidores;
}


}

?>

Servidor.php

<?php

namespace SistemaIfnmg\Entity;
use SistemaIfnmg\Entity;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity()
 * @ORM\Table(name = "servidor")
 */
class Servidor
{

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

/**
 * @var string
 *
 * @ORM\Column(name = "nome", type = "string", length=255)
 */
private $nome;
/**
 * @var string
 *
 * @ORM\Column(name = "sobrenome", type = "string", length=255)
 */
private $sobrenome;
/**
 * @var string
 *
 * @ORM\Column(name = "cargo", type = "string", length=255)
 */
private $cargo;
/**
 * @var string
 *
 * @ORM\Column(name = "matricula", type = "string", length=255)
 */
private $matricula;



/**
 * Get id
 *
 * @return int
 */
public function getId()
{
    return $this->id;
}

/**
 * Set id
 * @param int $id
 */
public function setId($id)
{
    $this->id = $id;
}

/**
 * Get nome
 *
 * @return string
 */
public function getNome()
{
    return $this->nome;
}

/**
 * Set nome
 *
 * @param string $nome
 */
public function setNome($nome)
{
    $this->nome = $nome;
}

/**
 * Get sobrenome
 *
 * @return string
 */
public function getSobrenome()
{
    return $this->sobrenome;
}

/**
 * Set sobrenome
 * @param string $sobrenome
 */
public function setSobrenome($sobrenome)
{
    $this->sobrenome = $sobrenome;
}

/**
 * Get cargo
 *
 * @return string
 */
public function getCargo()
{
    return $this->cargo;
}

/**
 * Set cargo
 *
 * @param string $cargo
 */
public function setCargo($cargo)
{
    $this->cargo = $cargo;
}
/**
 * Get matricula
 *
 * @return string
 */
public function getMatricula()
{
    return $this->matricula;
}

/**
 * Set matricula
 *
 * @param string $matricula
 */
public function setMatricula($matricula)
{
    $this->matricula = $matricula;
}




}

?>

ReuniadoServidor.php

<?php

namespace SistemaIfnmg\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
 * ReuniaoServidor
 *
 * @ORM\Table(name = "reuniaoservidor", indexes = {@ORM\Index(name = "fk_Reuniao_has_Servidor_Reuniao1_idx", columns = {"reuniaofk"}), @ORM\Index(name = "fk_Reuniao_has_Servidor_Servidor1_idx", columns= {"servidorfk"})})
 * @ORM\Entity
 */
class ReuniaoServidor
{
/**
 * @ORM\Id
 * @ORM\Column(type = "integer")
 * @ORM\GeneratedValue(strategy = "AUTO")
 */
private $id;

/**
 * @ORM\ManyToOne(targetEntity = "SistemaIfnmg\Entity\Reuniao", inversedBy = "servidores", cascade = {"persist"})
 * @ORM\JoinColumns({
 *   @ORM\JoinColumn(name = "reuniaofk", referencedColumnName = "id")
 * })
 */
private $reuniaofk;


/**
 * @ORM\ManyToOne(targetEntity = "SistemaIfnmg\Entity\Servidor", inversedBy = "servidores")
 * @ORM\JoinColumns({
 *   @ORM\JoinColumn(name = "servidorfk", referencedColumnName = "id")
 * })
 */
private $servidorfk;


/**
 * Get id
 * @return integer
 */
public function getId()
{
    return $this->id;
}

/**
 * @param int $id
 */
public function setId($id)
{
    $this->id = $id;
}

/**
 * Get reuniaofk
 * @return \SistemaIfnmg\Entity\Reuniao
 */
public function getReuniaofk()
{
    return $this->reuniaofk;
}

/**
 * Set reuniaofk
 * @param \SistemaIfnmg\Entity\Reuniao $reuniaofk
 * @return ReuniaoServidor
 */
public function setReuniaofk($reuniaofk)
{
    $this->reuniaofk = $reuniaofk;
    return $this;
}

/**
 * Get servidorfk
 * @return \SistemaIfnmg\Entity\Servidor
 */
public function getServidorfk()
{
    return $this->servidorfk;
}

/**
 * Set servidorfk
 * @param \SistemaIfnmg\Entity\Servidor $servidorfk
 * @return ReuniaoServidor
 */
public function setServidorfk($servidorfk)
{
    $this->servidorfk = $servidorfk;
    return $this;
}



}

?>

Давно пытаюсь исправить эту ошибку, помогите пожалуйста ?? Большое спасибо

почему бы вам не добавить cascade = {"persist", "remove"}, как написано в исключении, которое вы получили

Viktar Pryshchepa 08.08.2018 17:21

Спасибо за ответ!! Я не хочу оставаться сервидором, только Реуньяо !! Поэтому я добавляю, что каскад сохраняется только в Реуньяо.

Samuel Falci 09.08.2018 14:17
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
2
310
1

Ответы 1

Вам не нужна сущность, которая присоединяет Reuniao к Servidor (сущность ReuniaoServidor), поскольку Doctrine позаботится о таблице соединения за вас. Вам просто нужно указать столбцы соединения в сопоставлении JoinTable.

В Reuniao.php измените отображение серверов на:

/**
 * @ORM\ManyToMany(targetEntity = "SistemaIfnmg\Entity\Servidor")
 * @ORM\JoinTable(name = "reuniao_servidor",
 *      joinColumns = {@ORM\JoinColumn(name = "ruuniao_id", referencedColumnName = "id")},
 *     inverseJoinColumns{@ORM\JoinColumn(name = "servidor_id", referencedColumnName = "id")}
 *   )
 */
private $servidores;

также добавьте конструктор, который инициализирует массив для коллекции

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

См. https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/association-mapping.html#many-to-many-unidirectional

Привет, сэр. Благодарим за ответ и извиняемся за то, что ответили вам слишком долго. Проект устарел, но у меня есть ваши мысли, и он будет очень полезен для других проектов. Большое спасибо.

Samuel Falci 17.06.2021 15:44

Без проблем, рад, что смог помочь :)

Furison 02.07.2021 16:32

Другие вопросы по теме