• ENTRAR
  • No hay productos en el carrito.

Insertar datos en dos o mas tablas relacionadas

Viendo 6 publicaciones - del 1 al 6 (de un total de 6)
  • Autor
    Publicaciones
  • #6436

    Adrian
    Participante

    Cual seria el modo correcto, o las herramientas que provee el framework para  insertar datos en dos o mas tablas relacionadas utilizando un solo formulario y un solo controlador?

    #6551

    Cursosdesarrolloweb
    Jefe de claves

    Hola Adrian,

    Este tema no se cubre en el curso, este fin de semana voy a tratar de crear una entrada sobre este tema en uno-de-piera.com, en cuanto lo haya publicado te lo notificaré.

    Saludos.

    #6552

    Adrian
    Participante

    Muchas gracias Israel.

    Saludos

    #6576

    Cursosdesarrolloweb
    Jefe de claves

    Hola Adrian,

    No sé si te podrá servir.

    Formulario de Posts.

    
    <?php
    
    use Phalcon\Forms\Form;
    use Phalcon\Forms\Element\Text;
    use Phalcon\Forms\Element\TextArea;
    use Phalcon\Validation\Validator\PresenceOf;
    
    class PostsForm extends Form
    {
        public function __construct($entity, $userOptions = null)
        {
            parent::__construct($entity, $userOptions);
        }
    
        public function initialize()
        {
            $title = new Text(
                "title"
            );
    
            $title->addValidator(
                new PresenceOf([
                    'message' => 'El título es requerido'
                ])
            );
    
            $this->add(
                $title
            );
    
            $this->add(
                new TextArea(
                    "content"
                )
            );
        }
    }
    

    Formulario ExtraPostsForm, campos relacionados con un Post, aunque pertenecen a otra entidad.

    
    <?php
    
    use Phalcon\Forms\Form;
    use Phalcon\Forms\Element\Text;
    use Phalcon\Forms\Element\Submit;
    use Phalcon\Validation\Validator\PresenceOf;
    
    class ExtraPostsForm extends Form
    {
        public function __construct($entity, $userOptions = null)
        {
            parent::__construct($entity, $userOptions);
        }
    
        public function initialize()
        {
    
            $extra_field = new Text(
                "extra_field"
            );
    
            $extra_field->addValidator(
                new PresenceOf([
                    'message' => 'El extra_field es requerido'
                ])
            );
    
            $this->add(
                $extra_field
            );
    
            $this->add(new Submit('Submit Form'));
        }
    }
    

    Modelo Post.

    
    <?php
    
    class Posts extends \Phalcon\Mvc\Model
    {
    
        /**
         *
         * @var integer
         * @Primary
         * @Identity
         * @Column(type="integer", length=11, nullable=false)
         */
        public $id;
    
        /**
         *
         * @var string
         * @Column(type="string", length=200, nullable=false)
         */
        public $title;
    
        /**
         *
         * @var string
         * @Column(type="string", nullable=false)
         */
        public $content;
    
        /**
         * Initialize method for model.
         */
        public function initialize()
        {
            $this->setSchema("phalcon_forms");
            $this->hasOne('id', 'ExtraPosts', 'post_id', ['alias' => 'ExtraPosts']);
        }
    
        /**
         * Returns table name mapped in the model.
         *
         * @return string
         */
        public function getSource()
        {
            return 'posts';
        }
    
        /**
         * Allows to query a set of records that match the specified conditions
         *
         * @param mixed $parameters
         * @return Posts[]|Posts
         */
        public static function find($parameters = null)
        {
            return parent::find($parameters);
        }
    
        /**
         * Allows to query the first record that match the specified conditions
         *
         * @param mixed $parameters
         * @return Posts
         */
        public static function findFirst($parameters = null)
        {
            return parent::findFirst($parameters);
        }
    
    }
    

    Modelo ExtraPosts.

    
    <?php
    
    class ExtraPosts extends \Phalcon\Mvc\Model
    {
    
        /**
         *
         * @var integer
         * @Primary
         * @Identity
         * @Column(type="integer", length=11, nullable=false)
         */
        public $id;
    
        /**
         *
         * @var string
         * @Column(type="string", length=100, nullable=false)
         */
        public $extra_field;
    
        /**
         *
         * @var integer
         * @Column(type="integer", length=11, nullable=true)
         */
        public $post_id;
    
        /**
         * Initialize method for model.
         */
        public function initialize()
        {
            $this->setSchema("phalcon_forms");
            $this->belongsTo('post_id', '\Posts', 'id', ['alias' => 'Posts']);
        }
    
        /**
         * Returns table name mapped in the model.
         *
         * @return string
         */
        public function getSource()
        {
            return 'extra_posts';
        }
    
        /**
         * Allows to query a set of records that match the specified conditions
         *
         * @param mixed $parameters
         * @return ExtraPosts[]|ExtraPosts
         */
        public static function find($parameters = null)
        {
            return parent::find($parameters);
        }
    
        /**
         * Allows to query the first record that match the specified conditions
         *
         * @param mixed $parameters
         * @return ExtraPosts
         */
        public static function findFirst($parameters = null)
        {
            return parent::findFirst($parameters);
        }
    
    }
    

    Lógica del controlador que muestra y procesa el formulario.

    
    <?php
    
    class IndexController extends ControllerBase
    {
    
        public function indexAction()
        {
            $post = Posts::findFirst();
            $extraPost = $post->extraPosts;
            $postForm = new PostsForm($post);
            $extraPostForm = new ExtraPostsForm($extraPost);
    
            if($this->request->getPost())
            {
                $errors = [];
                if(
                    $postForm->isValid($this->request->getPost()) === false
                )
                {
                    foreach($postForm->getMessages() as $message)
                    {
                        $errors[] = $message;
                    }
                }
    
                if(
                    $extraPostForm->isValid($this->request->getPost()) === false
                )
                {
                    foreach($extraPostForm->getMessages() as $message)
                    {
                        $errors[] = $message;
                    }
                }
    
                if(count($errors) > 0)
                {
                    foreach ($errors as $error)
                    {
                        $this->flash->error($error);
                    }
                }
                else
                {
                    //TODO: Guardar la información y redirigir si es necesario
                }
            }
    
            $this->view->postForm = $postForm;
            $this->view->extraPostForm = $extraPostForm;
        }
    
    }
    

    Finalmente sólo tenemos que pintar el formulario.

    
    <div class="page-header">
        <h1>Form Post!</h1>
    </div>
    
    {{ content() }}
    
    <form method="post" action="/index/index">
        <p>
            <label>
                Name
            </label>
    
            {{ postForm.render("title", {'class':'form-control'}) }}
        </p>
    
        <p>
            <label>
                Description
            </label>
    
            {{ postForm.render("content", {'class': 'form-control'}) }}
        </p>
    
        <p>
            <label>
                Extra field
            </label>
    
            {{ extraPostForm.render("extra_field", {'class': 'form-control'}) }}
        </p>
    
        <p>
            {{ extraPostForm.render("Submit Form", {'class': 'form-control btn btn-success'}) }}
        </p>
    </form>
    

    Es una idea de cómo puedes realizar esta tarea, en este caso estamos editando, pero para poder crear simplemente deberíamos pasar una instancia de cada modelo a su respectivo formulario, trabaja de la misma forma.

    Saludos.

    #6868

    Adrian
    Participante

    Israel, muchísimas gracias por tu interés en darme una respuesta que se encuentra fuera de la cobertura del curso, no he tenido tiempo de agradecerte con anterioridad.

    Saludos y muchas gracias nuevamente.

    #6870

    Cursosdesarrolloweb
    Jefe de claves

    Un placer Adrian.

    Saludos.

Viendo 6 publicaciones - del 1 al 6 (de un total de 6)

Debes estar registrado para responder a este debate.

Síguenos en las redes sociales para estar al tanto de los últimas novedades :)

Facebook
Facebook
Google+
Google+
https://www.cursosdesarrolloweb.es/forums/topic/insertar-datos-en-dos-o-mas-tablas-relacionadas">
YOUTUBE
Pinterest
Pinterest
top
Cursosdesarrolloweb ©. Todos los derechos reservados.
MASTER VUEJS, 4 cursos para hacerte experto en Vuejs 2 por el precio de 2Más información
+ +

Login

Create an Account Back to login/register