Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

[SOLUCIONADO] Dos dudas de Laravel

Estas en el tema de Dos dudas de Laravel en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Buenas, soy nuevo en Laravel y estoy intentando migrar un código y se me han planteado dos cuestiones. La primera es que ya tengo las ...
  #1 (permalink)  
Antiguo 23/06/2013, 12:35
Avatar de Fylux  
Fecha de Ingreso: junio-2012
Mensajes: 141
Antigüedad: 11 años, 10 meses
Puntos: 9
Pregunta Dos dudas de Laravel

Buenas, soy nuevo en Laravel y estoy intentando migrar un código y se me han planteado dos cuestiones.

La primera es que ya tengo las tablas de mi proyecto creadas así que, ¿debería volver a crearlas con migraciones?
Además en Laravel le añade create_at y update_at, ¿debo añadírselo a las tablas que ya tengo?

La segunda cuestión es, ¿debo creo un modelo por cada tabla exactamente?

Saludos.
__________________
Si todos escribiéramos sin faltas de ortografía, el mundo sería un lugar mejor.
  #2 (permalink)  
Antiguo 23/06/2013, 15:45
Avatar de JaimeMSE  
Fecha de Ingreso: diciembre-2010
Ubicación: Isla Cristina (Huelva)
Mensajes: 164
Antigüedad: 13 años, 4 meses
Puntos: 7
Respuesta: Dos dudas de Laravel

Hola,

Te voy contestando por pasos:
Cita:
La primera es que ya tengo las tablas de mi proyecto creadas así que, ¿debería volver a crearlas con migraciones?
No necesariamente. Las migraciones de laravel te ayudan a volver a un estado anterior de cuando creastes alguna tabla o conjunto de tablas etc (principalmente usando el comando php artisan migrate). Pero no es para nada necesario. Es sólo para que puedas crear nuevas tablas con el comando, eliminarlas, etc.

Cita:
Además en Laravel le añade create_at y update_at, ¿debo añadírselo a las tablas que ya tengo?
Eso se arregla añadiendo la variable -- public $timestamps = false; -- a cada clase de cada modelo que no quieras que se le añada esos dos campos.

Cita:
La segunda cuestión es, ¿debo creo un modelo por cada tabla exactamente?
Para nada, yo por ejemplo tengo un archivo en models que se llama Usuario.php y dentro tengo la clase Usuarios, otra clase llamada Mensajes_privados, otra llamada Mascotas (estoy haciendo una web relacionada con los animales).

Lo que yo entiendo es que intentes juntar todo lo necesario de un conjunto de datos de tu web. Me refiero a que si tienes un modelo que trata de usuarios y los mensajes privados y las mascotas van relacionadas directamente con el modelo (que si no existiese el modelo Usuario éstas no podrían existir), que las unas en mismo archivo.

Espero haberte ayudado.
Un saludo!
__________________
@JaimeMSE - ¡Sígueme!
  #3 (permalink)  
Antiguo 24/06/2013, 08:53
Avatar de Fylux  
Fecha de Ingreso: junio-2012
Mensajes: 141
Antigüedad: 11 años, 10 meses
Puntos: 9
Respuesta: Dos dudas de Laravel

Muchas gracias por responder y si no es mucha molestia quisiera exponer dos dudas que me salen entonces.
En los modelos he visto que en Laravel se relacionan en uno con uno, uno con varios o varios con varios.
Lo que ocurre es que yo tengo un sistema de mensajería donde cada mensaje tiene id_emisor e id_receptor. De forma que no se como hacer para que en unos casos busque el id del usuario en el emisor y en otros caso en el receptor.

Mi segunda duda es si hace falta que diga la key que quiero usar para relacionar una tabla con otra. Y si no hace falta, ¿qué llave busca?

Saludos y gracias de antemano.
__________________
Si todos escribiéramos sin faltas de ortografía, el mundo sería un lugar mejor.
  #4 (permalink)  
Antiguo 24/06/2013, 12:13
Avatar de JaimeMSE  
Fecha de Ingreso: diciembre-2010
Ubicación: Isla Cristina (Huelva)
Mensajes: 164
Antigüedad: 13 años, 4 meses
Puntos: 7
Respuesta: Dos dudas de Laravel

Hola

Para la primera duda no podrías usar la función find() que usa laravel. Por ejemplo:
Código PHP:
Ver original
  1. $usuario = Usuario::find(1)
Eso te devolvería el primer usuario buscando por el campo ID. Pero como en tu caso no lo usas puedes hacer:
Código PHP:
Ver original
  1. $usuario = Usuario::where('id_receptor','=', 1)->first();
Y ya te daría el mensaje con el id_receptor 1.

Para la segunda duda consulta:
http://four.laravel.com/docs/eloquent#relationships

Un saludo!
__________________
@JaimeMSE - ¡Sígueme!
  #5 (permalink)  
Antiguo 24/06/2013, 12:14
 
Fecha de Ingreso: junio-2013
Ubicación: Madrid
Mensajes: 73
Antigüedad: 10 años, 10 meses
Puntos: 27
Respuesta: Dos dudas de Laravel

Cita:
Iniciado por Fylux Ver Mensaje
Muchas gracias por responder y si no es mucha molestia quisiera exponer dos dudas que me salen entonces.
En los modelos he visto que en Laravel se relacionan en uno con uno, uno con varios o varios con varios.
Lo que ocurre es que yo tengo un sistema de mensajería donde cada mensaje tiene id_emisor e id_receptor. De forma que no se como hacer para que en unos casos busque el id del usuario en el emisor y en otros caso en el receptor.

Mi segunda duda es si hace falta que diga la key que quiero usar para relacionar una tabla con otra. Y si no hace falta, ¿qué llave busca?

Saludos y gracias de antemano.
En el modelo Mensaje puedes tener algo así:

Código PHP:
        // models/mensaje.php

    
public function emisor()
    {
        return 
$this->BelongsTo('User''from_id');
    }

    public function 
receptor()
    {
        return 
$this->BelongsTo('User''to_id');
    } 
Y en el controlador algo así:

Código PHP:
  // controllers/mensajes.php

  
$mensajes Mensaje::with('emisor''receptor')->get(); 
Tanto from_id como to_id enganchan con el user.id, salvo que cambies el primary key del modelo user.
  #6 (permalink)  
Antiguo 24/06/2013, 12:26
 
Fecha de Ingreso: junio-2013
Ubicación: Madrid
Mensajes: 73
Antigüedad: 10 años, 10 meses
Puntos: 27
Respuesta: Dos dudas de Laravel

Para buscar, puedes añadir algo así:

Código PHP:
    //models/mensaje.php

    
public function scopeDondeEmisor($query$from_id)
    {
        return 
$query->where('from_id''='$from_id);
    } 
Y en el controlador usarlo así:

Código PHP:
  // controllers/mensajes.php

  
$mensajes Mensaje::with('emisor''receptor')->DondeEmisor(3)->get(); 
Luego en la vista puedes:

Código PHP:

@foreach ($mensajes as $mensaje):
 {{ 
$mensaje->emisor->nombre }} -  {{ $mensaje->receptor->nombre }}
@endforeach 
Creo que algo así se puede hacer.
  #7 (permalink)  
Antiguo 24/06/2013, 13:12
Avatar de Fylux  
Fecha de Ingreso: junio-2012
Mensajes: 141
Antigüedad: 11 años, 10 meses
Puntos: 9
Respuesta: Dos dudas de Laravel

Muchas gracias por las repuestas :D
Espero no abusar de ustedes si les pregunto una duda sobre como aplicar correctamente el patrón MVC en mi proyecto.
El proyecto tiene como un 'motor' que se ejecuta cada vez que se actualiza la página y hacer alrededor de unas 50 consultas a la base de datos.
¿Este debería en un método en el modelo, no?

Saludos.
__________________
Si todos escribiéramos sin faltas de ortografía, el mundo sería un lugar mejor.
  #8 (permalink)  
Antiguo 24/06/2013, 15:44
 
Fecha de Ingreso: junio-2013
Ubicación: Madrid
Mensajes: 73
Antigüedad: 10 años, 10 meses
Puntos: 27
Respuesta: Dos dudas de Laravel

Cita:
Iniciado por Fylux Ver Mensaje
Muchas gracias por las repuestas :D
Espero no abusar de ustedes si les pregunto una duda sobre como aplicar correctamente el patrón MVC en mi proyecto.
El proyecto tiene como un 'motor' que se ejecuta cada vez que se actualiza la página y hacer alrededor de unas 50 consultas a la base de datos.
¿Este debería en un método en el modelo, no?

Saludos.
Toda la lógica del negocio debe ir en la capa modelo. En tu caso deberías tener varios modelos para todas esas operaciones.

Trata de que las clases no pasen de las 200 líneas y los métodos ocupen menos de 20 líneas.

El controlador sólo debe proporcionar datos al modelo.
  #9 (permalink)  
Antiguo 25/06/2013, 02:06
Avatar de Fylux  
Fecha de Ingreso: junio-2012
Mensajes: 141
Antigüedad: 11 años, 10 meses
Puntos: 9
Respuesta: Dos dudas de Laravel

¿Entonces este ejemplo no sería correcto?
Código PHP:
class RegistrarController extends BaseController
{
    public function 
registrar()
    {
        
$usuario Input::get('usuario');
        
$password Input::get('password');
        
$email Input::get('email');
        
$rules = array(
                
'usuario' => 
                    array(
'required''min:3','max:20','alpha_dash','required'),
                
'password'=>
                    array(
'required''min:6','max:50','alpha_dash','required'),
                
'email'=>
                    array(
'required','email')
                    );

        
$validator Validator::make(Input::all(), $rules);

        if (
$validator->fails())
        {
            return 
Redirect::to('login')->withErrors($validator);
        }

        
$user Usuario::where('nombre''='$usuario)->orWhere('correo','=',$email)->first();
        if (
is_null($user))
        {
            
$user = new Usuario;
            
$user->nombre $usuario;
            
$user->password $password;
            
$user->correo $email;
            
$user->fecha_ingreso=time();
            
$user->ip=Request::getClientIp();

            
$user->save();
        }
        else
        {
            echo 
"Pong";
        }
    }

Supongo que para que fuese más MVC debería hacer que el insert se hiciera con un método del modelo.
¿Estoy en lo cierto?

Saludos.
__________________
Si todos escribiéramos sin faltas de ortografía, el mundo sería un lugar mejor.
  #10 (permalink)  
Antiguo 25/06/2013, 04:29
 
Fecha de Ingreso: junio-2013
Ubicación: Madrid
Mensajes: 73
Antigüedad: 10 años, 10 meses
Puntos: 27
Respuesta: Dos dudas de Laravel

Yo lo veo bien. Yo crearía algunos métodos protegidos en el controlador para validar y otro para crear el usuario. Por ejemplo:

Código PHP:
 $this->validarRegistro();
 
$this->crearUsuario(); 
Y esto:

Código PHP:
 $user Usuario::where('nombre''='$usuario)->orWhere('correo','=',$email)->first();
 if (
is_null($user)) 
Lo sustituiría por:

Código PHP:
 if ( ! Usuario::existe($nombre$email)) 
Obviamente tienes que crear el metodo existe en el modelo.
  #11 (permalink)  
Antiguo 25/06/2013, 05:29
Avatar de Fylux  
Fecha de Ingreso: junio-2012
Mensajes: 141
Antigüedad: 11 años, 10 meses
Puntos: 9
Respuesta: Dos dudas de Laravel

Gracias.
Un problema estoy teniendo todo el día es el del Login.
Ya sabes, este es mi controlador para registrar
Código PHP:
<?php

class RegistrarController extends BaseController
{
    public function 
registrar()
    {
        
$usuario Input::get('usuario');
        
$password Hash::make(Input::get('password'));
        
$email Input::get('email');
        
$rules = array(
                
'usuario' => 
                    array(
'required''min:3','max:20','alpha_dash','required'),
                
'password'=>
                    array(
'required''min:6','max:50','alpha_dash','required'),
                
'email'=>
                    array(
'required','email')
                    );

        
$validator Validator::make(Input::all(), $rules);

        if (
$validator->fails())
        {
            return 
Redirect::to('login')->withInput()->withErrors($validator);
        }

        
$user Usuario::where('usuario''='$usuario)->orWhere('correo','=',$email)->orWhere('ip','=',Request::getClientIp())->first();
        if (
is_null($user))
        {
            
$user = new Usuario;
            
$user->usuario $usuario;
            
$user->password $password;
            
$user->correo $email;
            
$user->fecha_ingreso=time();
            
$user->ip=Request::getClientIp();

            
$user->save();

            return 
Redirect::to('login')->with('msg','Te has registrado correctamente');
        }
        else
        {
            return 
Redirect::to('login')->with('msg','El usuario o el correo ya está en uso');
        }
    }
}
?>
Y este mi controlador para loguear
Código PHP:
<?php

class UsuarioController extends BaseController {

    public function 
login()
    {
        
$user = array(
            
'usuario' => Input::get('usuario'),
            
'password' => Input::get('password')
        );
        
        if (
Auth::attempt($user)) {
            return 
Redirect::to('login')
                ->
with('msg''You are successfully logged in.');
        }
    }

}
?>
Sin embargo no se porqué siempre me devuelve falso. He probado a no ponerle Hash y cosas así. Los campos de mi tabla usuarios son usuario y password.

¿Alguna idea de por qué no me loguea?

Saludos y gracias.
__________________
Si todos escribiéramos sin faltas de ortografía, el mundo sería un lugar mejor.
  #12 (permalink)  
Antiguo 25/06/2013, 05:43
 
Fecha de Ingreso: junio-2013
Ubicación: Madrid
Mensajes: 73
Antigüedad: 10 años, 10 meses
Puntos: 27
Respuesta: Dos dudas de Laravel

Posiblemente porque estás usando el atributo usuario en vez de username en el modelo usuario.

Revisa esto:

Código PHP:

// models/usuario.php

public function getAuthIdentifier() {

   return 
$this->usuario;


  #13 (permalink)  
Antiguo 25/06/2013, 05:45
Avatar de Fylux  
Fecha de Ingreso: junio-2012
Mensajes: 141
Antigüedad: 11 años, 10 meses
Puntos: 9
Respuesta: Dos dudas de Laravel

¿Que debo hacer exactamente con esa función?
Saludos.
__________________
Si todos escribiéramos sin faltas de ortografía, el mundo sería un lugar mejor.
  #14 (permalink)  
Antiguo 25/06/2013, 06:03
 
Fecha de Ingreso: junio-2013
Ubicación: Madrid
Mensajes: 73
Antigüedad: 10 años, 10 meses
Puntos: 27
Respuesta: Dos dudas de Laravel

Cita:
Iniciado por Fylux Ver Mensaje
¿Que debo hacer exactamente con esa función?
Saludos.
Me parece que hay que cambiar el config/auth.php

y añadir 'username' => 'email' o el campo que sea a validar.
  #15 (permalink)  
Antiguo 25/06/2013, 06:05
Avatar de Fylux  
Fecha de Ingreso: junio-2012
Mensajes: 141
Antigüedad: 11 años, 10 meses
Puntos: 9
Respuesta: Dos dudas de Laravel

Eso lo he cambiado para poner
'Model'=>'Usuario'
'table'=>'usuarios'

Pero lo que tu dices está en Laravel 3, pero no en el 4.

Código PHP:
<?php

return array(

    
/*
    |--------------------------------------------------------------------------
    | Default Authentication Driver
    |--------------------------------------------------------------------------
    |
    | This option controls the authentication driver that will be utilized.
    | This drivers manages the retrieval and authentication of the users
    | attempting to get access to protected areas of your application.
    |
    | Supported: "database", "eloquent"
    |
    */

    
'driver' => 'eloquent',

    
/*
    |--------------------------------------------------------------------------
    | Authentication Model
    |--------------------------------------------------------------------------
    |
    | When using the "Eloquent" authentication driver, we need to know which
    | Eloquent model should be used to retrieve your users. Of course, it
    | is often just the "User" model but you may use whatever you like.
    |
    */

    
'model' => 'Usuario',

    
/*
    |--------------------------------------------------------------------------
    | Authentication Table
    |--------------------------------------------------------------------------
    |
    | When using the "Database" authentication driver, we need to know which
    | table should be used to retrieve your users. We have chosen a basic
    | default value but you may easily change it to any table you like.
    |
    */

    
'table' => 'usuarios',

    
/*
    |--------------------------------------------------------------------------
    | Password Reminder Settings
    |--------------------------------------------------------------------------
    |
    | Here you may set the settings for password reminders, including a view
    | that should be used as your password reminder e-mail. You will also
    | be able to set the name of the table that holds the reset tokens.
    |
    */

    
'reminder' => array(

        
'email' => 'emails.auth.reminder''table' => 'password_reminders',

    ),

);
Saludos.
__________________
Si todos escribiéramos sin faltas de ortografía, el mundo sería un lugar mejor.

Etiquetas: dudas
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:47.