1
resposta

Como persistir em uma relação ManyToOne?

Tentei separar os cursos em categorias através da criação de uma nova entidade Categoria, mas não estou conseguindo pegar o valor e persistir no banco de dados.

Criei a entidade Categoria com:

/**
 * @Entity
 * @Table (name="categorias")
 */
class Categoria
{
    /**
     * @Id
     * @GeneratedValue
     * @Column (type = "integer")
     */
    private $id;

    /**
     * @Column (type="string")
     */
    private $nomeCategoria;

    /**
     * @OneToMany (targetEntity="Curso", mappedBy="Categoria", cascade={"remove", "persist"})
     */
    private $cursos;

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

e adiciono, além dos getters e setters, um método pra adicionar cursos, e vincularia à entidade Curso, deixando a tabela de cursos também com um categoria_id gerado por Migrations. Não deixei o códico todo aqui para que não ficasse muito grande, mas adicionei o método ensinado no curso de Doctrine:

    public function addCurso(Curso $curso)
    {
        $this->cursos->add($curso);
        $curso->setCategoria($this);
        return $this;
    }

Mas acho que não é assim que eu deveria adicionar um curso e vincular à categoria.

Mas tentei persistir isso buscando o valor da categoria_id dessa forma na view:

<select name="categoria_id">
            <?php foreach($categorias as $categoria): ?>
                <option value="<?= $categoria['id']?>"><?= $categoria['nome']?></option>
            <?php endforeach?>
            </select>

E tentei pegar o valor por um INPUT_POST:

$categoriaId = filter_input(INPUT_POST, 'categoria_id', FILTER_SANITIZE_STRING);

Ah e adicionei em Categorias, os valores Javascript, PHP e Laravel só para fins de teste e para tentar vincular os Cursos aos Ids dessas categorias. Mas isso parece que não funciona. Alguém poderia me dar uma dica?

1 resposta

Verifica na sua classe Curso como foi feito a declaração da variável Categoria. Se estiver private $categoria com o C minúsculo, isto deve refletir no mappedBy, ficando:

/**
 * @Entity
 * @Table (name="categorias")
 */
class Categoria
{
    /**
     * @Id
     * @GeneratedValue
     * @Column (type = "integer")
     */
    private $id;

    /**
     * @Column (type="string")
     */
    private $nomeCategoria;

    /**
     * @OneToMany (targetEntity="Curso", mappedBy="categoria", cascade={"remove", "persist"})
     */
    private $cursos;

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