Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Marcelo_Delta

[Resolvido] ORM Doctrine 2

Recommended Posts

Segue abaixo os códigos.

 

/** @MappedSuperclass */
abstract class Usuario 
{
    /** 
     * @Column(type="integer")
     */
    private $login;
    /** 
     * @Column(type="integer")
     */
    private $senha;
    /**
     * @OneToOne(targetEntity="Prof")
     * @JoinColumn(name="usuario_id", referencedColumnName="id")
     */
    private $prof;
    

    public function setLogin($login)
    {
         $this->login = $login;
         return $this; // fluent interface
    }

    public function getLogin()
    {
         return $this->login;
    }

    public function setSenha($senha)
    {
         $this->senha = $senha;
         return $this; // fluent interface
    }

    public function getSenha()
    {
         return $this->senha;
    }

    public function addProf(Prof $prof)
    {
         $this->prof = $prof;
         return $this; // fluent interface
    }

    public function getProf()
    {
         return $this->prof;
    }    
}

---------------------------------------------

 

<?php

namespace models;

/**
 * @Entity
 * @Table(name="prof")
 */
 class Prof extends \models\Usuario
{
    /** 
     * @Id @Column(type="integer")
     * @GeneratedValue(strategy="AUTO")
     */
    private $id;
    /** 
     * @Column(type="string",length=45,nullable=true)
     */
    private $nome;
    /** 
     * @Column(type="string",length=45,nullable=true)
     */
    private $endereco;
    /** 
     * @Column(type="string",length=45,nullable=true)
     */
    private $numero;

	///public function comer(){}

    public function setId($id)
    {
         $this->id = $id;
         return $this; // fluent interface
    }

    public function getId()
    {
         return $this->id;
    }

    public function setNome($nome)
    {
         $this->nome = $nome;
         return $this; // fluent interface
    }

    public function getNome()
    {
         return $this->nome;
    }

    public function setEndereco($endereco)
    {
         $this->endereco = $endereco;
         return $this; // fluent interface
    }

    public function getEndereco()
    {
         return $this->endereco;
    }

    public function setNumero($numero)
    {
         $this->numero = $numero;
         return $this; // fluent interface
    }

    public function getNumero()
    {
         return $this->numero;
    }


}

-----------------------------------------

 

try
            {
				
                $usuario = new models\Prof();
                
                $usuario->setLogin('123');
                $usuario->setSenha('123');
                $usuario->setNome('Marcelo');
                $usuario->setEndereco('Nabuco');
                $usuario->setNumero('123');
                
                $this->em->persist($usuario);

                print_r('<pre>');
                print_r($usuario);
                print_r('<pre>');

                $this->em->flush();
                echo 'congratulation';
            }
            catch (Exception $exception)
            {
                echo $exception->getMessage();
            }


Abraços,

Marcelo Wanderley

Compartilhar este post


Link para o post
Compartilhar em outros sites

esse trecho do try, fica exatamente onde?

 

e qual é o problema/dúvida ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

O try é apenas para testar erros na execução.

 

O problema é que não consigo inserir no banco de dados.

 

Gera este erro

 

models\Prof Object

(

[id:models\Prof:private] =>

[nome:models\Prof:private] => Marcelo

[endereco:models\Prof:private] => Nabuco

[numero:models\Prof:private] => 123

[login:models\Usuario:private] => Login

[senha:models\Usuario:private] => Senha

[proves:models\Usuario:private] =>

)

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'login' in 'field list'

 

 

--------------

 

Para inserir no banco segue o code abaixo.

 

$usuario = new models\Prof();

 

$usuario->setLogin('123');

$usuario->setSenha('123');

$usuario->setNome('Marcelo');

$usuario->setEndereco('Nabuco');

$usuario->setNumero('123');

 

$this->em->persist($usuario);

 

print_r('<pre>');

print_r($usuario);

print_r('<pre>');

 

$this->em->flush();

echo 'congratulation';

 

 

Detalhe. O banco de dados esta nesta mesma hierarquia.

 

- usuario

id

login

senha

 

- prof

nome

endereco

numero

usuario_id

 

 

 

Estou usando o ORM Doctrine 2

 

 

Abraços,

Valeu...

Compartilhar este post


Link para o post
Compartilhar em outros sites

A mensagem de erro foi clara, um erro de banco, informando que não existe a coluna 'login'.

 

Verifique se a grafia está correta ou se está tentando trabalhar na tabela certa.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Evandro,

 

Esta tudo ok. As tabelas estão no com grafia correta.

 

 

Um exemplo. Quando retiro o campo login, automaticamente ele gera esse mesmo erro para outra tabela, no caso a que estiver depois dela..

 

 

Abraços,

Valeu pela atenção

Marcelo Wanderley

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal acho que consegui .

 

 

Fiz as classes normalmente e depois executei o comando para o doctrine criar as tabelas automaticamente. Existe funções de manipulação do banco, bem semelhante a versão 1.2

 

$tool = new \Doctrine\ORM\Tools\SchemaTool($this->em);

$classes = array(

 

//Superclass

$this->em->getClassMetadata('models\Usuario'),

 

//Criar tabela Professor

$this->em->getClassMetadata('models\Prof')

 

);

$tool->createSchema($classes);

echo "Done!";

 

Assim posso fazer as entidades e depois executar comandos para manipulação do banco.

 

 

Code completo

=======================================

<?php

 

namespace models;

 

/** @MappedSuperclass */

abstract class Usuario

{

/**

* @Column(type="string")

*/

private $login;

/**

* @Column(type="string")

*/

private $senha;

 

 

public function setLogin($login)

{

$this->login = $login;

return $this; // fluent interface

}

 

public function getLogin()

{

return $this->login;

}

 

public function setSenha($senha)

{

$this->senha = $senha;

return $this; // fluent interface

}

 

public function getSenha()

{

return $this->senha;

}

}

 

=======================================================

<?php

 

namespace models;

 

/**

* @Entity

* @Table(name="prof")

*/

class Prof extends \models\Usuario

{

/**

* @Id @Column(type="integer")

* @GeneratedValue(strategy="AUTO")

*/

private $id;

/**

* @Column(type="string",length=45,nullable=true)

*/

private $nome;

/**

* @Column(type="string",length=45,nullable=true)

*/

private $endereco;

/**

* @Column(type="string",length=45,nullable=true)

*/

private $numero;

 

///public function comer(){}

 

public function setId($id)

{

$this->id = $id;

return $this; // fluent interface

}

 

public function getId()

{

return $this->id;

}

 

public function setNome($nome)

{

$this->nome = $nome;

return $this; // fluent interface

}

 

public function getNome()

{

return $this->nome;

}

 

public function setEndereco($endereco)

{

$this->endereco = $endereco;

return $this; // fluent interface

}

 

public function getEndereco()

{

return $this->endereco;

}

 

public function setNumero($numero)

{

$this->numero = $numero;

return $this; // fluent interface

}

 

public function getNumero()

{

return $this->numero;

}

 

 

}

 

==============================================

$tool = new \Doctrine\ORM\Tools\SchemaTool($this->em);

$classes = array(

 

//Superclass

$this->em->getClassMetadata('models\Usuario'),

 

//Criar tabela Professor

$this->em->getClassMetadata('models\Prof'),

 

);

$tool->createSchema($classes);

echo "Done!";

 

 

 

 

Vou estudar mais...

 

Valeu Pessoal.

 

Abraços,

Marcelo Wanderley

Compartilhar este post


Link para o post
Compartilhar em outros sites

Até onde vi (mesmo que já tenha conseguido) no seu modelo de dados(o que você tinha criado) você não especificou as colunas que estão dando erro. Só tem o get/set delas.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa NetShot,

 

Realmente não mostrei o erro que estava rolando.

 

Segue abaixo.

models\Prof Object

(

[id:models\Prof:private] =>

[nome:models\Prof:private] => Marcelo

[endereco:models\Prof:private] => Nabuco

[numero:models\Prof:private] => 123

[login:models\Usuario:private] => Login

[senha:models\Usuario:private] => Senha

[proves:models\Usuario:private] =>

)

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'login' in 'field list'

Compartilhar este post


Link para o post
Compartilhar em outros sites

O que eu quis dizer foi o seguinte:

 

Veja seu primeiro model :

 


namespace models;

/**
 * @Entity
 * @Table(name="prof")
 */
 class Prof extends \models\Usuario
{
    /** 
 	* @Id @Column(type="integer")
 	* @GeneratedValue(strategy="AUTO")
 	*/
    private $id;
    /** 
 	* @Column(type="string",length=45,nullable=true)
 	*/
    private $nome;
    /** 
 	* @Column(type="string",length=45,nullable=true)
 	*/
    private $endereco;
    /** 
 	* @Column(type="string",length=45,nullable=true)
 	*/
    private $numero;

Note que o campo que está contido ai no erro, não está mapeado no seu model. Entendeu?

 

Você pode fazer uma engenharia reversa ai :

 

http://www.doctrine-...rse-engineering

Compartilhar este post


Link para o post
Compartilhar em outros sites

/* I have a dream... e neste sonho eu consigo criar um EntityManager.
Comecei a ler o manual do doctrine 2.0 e não saí do capítulo 3 - configuração.
Baixei a versão 2.0. A estrutura dos arquivos é essa:
Doctrine
   \Common
   \DBAL
   \ORM
   \Symfony
Pus o Doctrine na pasta projetoORM e ficou assim
projetoORM
   \Doctrine
   \Entities
   \Proxies
   \Util
       \Util\bootstrap.php
       \Util\ConnectionFactory.php
index.php
*/

 

<?php
/* bootstrap.php */
require_once 'Doctrine\Common\ClassLoader.php';

       $class_loade = new \Doctrine\Common\ClassLoader('\Doctrine\Common', 'Common');
       $class_loade->register();

       $class_loade = new \Doctrine\Common\ClassLoader('\Doctrine\DBAL', 'DBAL');
       $class_loade->register();

       $class_loade = new \Doctrine\Common\ClassLoader('\Doctrine\ORM', 'ORM');
       $class_loade->register();
?>

<?php

/* -------> */ require_once 'bootstrap.php'; # preciso dessa linha? Se preciso, coloco onde?

use Doctrine\ORM\EntityManager,
Doctrine\ORM\Configuration;

class ConnectionFactory {

   private $entityManager = false;

   private $connectionOptions = array(
       'driver' => 'pdo_mysql',
       'host' => 'localhost',
       'user' => 'root',
       'password' => '',
       'dbname' => 'test'
   );

   private function getContext() {
       $config = new Configuration;
       $config->setMetadataCacheImpl(new \Doctrine\Common\Cache\ArrayCache());
       $driverImpl = $config->newDefaultAnnotationDriver(dirname(dirname(__FILE__)) . '\Entities');
       $config->setMetadataDriverImpl($driverImpl);
       $config->setQueryCacheImpl($cache);
       $config->setProxyDir(dirname(dirname(__FILE__)) . '\Proxies');
       $config->setProxyNamespace('DoctrineProject/Proxies');
       return $config;
   }

   public static function getInstance() {
       if (!$entityManager) {
           /* o erro acontece aqui --->*/ $entityManager = EntityManager::create($this->connectionOptions, $this->getContext());
       }
       return $entityManager;
   }

}
?>

 

<!-- index.php -->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
   <head>
       <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
       <title></title>
   </head>
   <body>
       <?php
       require_once 'Project/Util/ConnectionFactory.php';

       $em = ConnectionFactory::getInstance();
       ?>
   </body>
</html>

/*
O erro é esse: "Fatal error: Class 'Doctrine\ORM\EntityManager' not found in E:\xampp\htdocs\Doctrine\Project\Util\ConnectionFactory.php on line 33"
Alguém tem uma teoria?
*/

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.