Mostrando entradas con la etiqueta Eloquent ORM. Mostrar todas las entradas
Mostrando entradas con la etiqueta Eloquent ORM. Mostrar todas las entradas

Eloquent: groupby con count

$arrAux = $cnn->table('ips_baneados')
    ->select('ip_user', DB::raw('count(*) as totalIps'))
    ->groupByRaw('ip_user')
    ->havingRaw('totalIps > 2 ')
    ->orderby('totalIps','desc')
    ->get();

Eloquent: relaciones polimórficas

Que una misma tabla pueda establecer relaciones una a muchas (o muchas a muchas) con tablas diferentes.

Por ejemplo guardar comentarios tanto de películas como de cineastas.

Crear un modelo Comentario:
public function comentario() {
return $this->morphTo();
}

En el modelo Pelicula:
public function comentarios() {
return $this->morphMany("App\Comentario", "comentario");
}

En el modelo Cineasta:
public function comentarios() {
return $this->morphMany("App\Comentario", "comentario");
}

La tabla comentario debe tener este formato:
id
comentario
comentario_id // guardar el id de la tabla
comentario_type // guardar el tipo de modelo que es:  App\Cineasta ó App\Pelicula

Y ya en routes/web.php:
Route::get("/comentarios", function() {
    $cineasta = Cineasta::find(1);
    foreach ($cineasta->comentarios as $item) {
        echo $item->comentario."<br>";
    }
    echo "<hr>";
    $pelicula = Pelicula::find(1);
    foreach ($pelicula->comentarios as $item) {
        echo $item->comentario."<br>";
    }
});

Eloquent: Relaciones muchos a muchos

Para las relaciones muchos a muchos siempre obligatoriamente hay que crear una tabla pivot que enlace las dos tablas entre sí.

Tabla cineastas:
id
nombre

Tabla gremios:
id
nombre_gremio

La tabla pivot se tiene que llamar obligatoriamente siempre el nombre de los dos modelos ordenados alfabéticamente separados por guión, en este caso "cineasta_gremio"
cineasta_premio:
cineasta_id
gremio_id

En el modelo Cineasta:
public function gremios() {
   return $this->belongsToMany("App\Gremio");
}

En routes/web.php:
Route::get("/cineasta/{id}/gremio", function($id) {
    $cineasta = Cineasta::find($id);
    foreach ($cineasta->gremios as $item) {
       echo $item->nombre_gremio."<br>";

    }
});

Así si por ejemplo el cineasta 1 es Woody Allen sacará los gremios de actor, director y guionista.

Eloquent: Relaciones 1 a muchos

En el modelo Cliente:
public function articulos() {
return $this->hasMany("App\Articulo");
}

En routes/web.php:
Route::get("/articulos", function() {
    $articulos = Cliente::find(1)->articulos;
    foreach ($articulos as $item) {
        echo $item->nombre_articulo."<br>";
    }
});

Por supuesto si se quiere se puede filtrar el resultado por lo q se quiera:
$articulos = Cliente::find(1)->articulos->where("pais_origen", "Italia");

Eloquent: relaciones 1 a 1

En la tabla articulos crear un campo cliente_id (obligatorio que sea de esta forma: nombre modelo+"_id")

En el modelo Cliente:
public function articulo() {
return $this->hasOne("App\Articulo");
}

En routes/web.php:
Route::get("/cliente/{id}/articulo", function($id) {
    return Cliente::find($id)->articulo->nombre_articulo;
});

La relación inversa sería:
En el modelo Articulo:
public function cliente() {
return $this->belongsTo('App\Cliente');
}

En routes/web.php:
Route::get("/articulo/{id}/cliente", function($id) {
    return Articulo::find($id)->cliente->nombre;
});

Ejemplos Eloquent ORM

$articulos = Articulo::all();

// take: indica el número de reg a sacar (el limit)
$articulos = Articulo::where("pais_origen", "España")->take(2)->orderby("nombre_articulo")->get();

Ejemplos de inserciones y modificaciones:
Route::get("/insertar", function() {
    $articulos = new Articulo;
    $articulos->nombre_articulo = "bolígrafo azul";
    $articulos->precio = "15.66";
    $articulos->pais_origen = "España";
    $articulos->observaciones = "Escribe en azul";
    $articulos->seccion = "papelería";
    $articulos->save();
});

Route::get("/modificar", function() {
    $articulos = Articulo::find(9);
    $articulos->nombre_articulo = "bolígrafo azul modificado";
    $articulos->precio = "19.75";
    $articulos->save();
});

Modificar varios registros:
Route::get("/modificar_varios", function() {
    Articulo::where("seccion", "Western")
            ->update(["seccion" =>"Oeste"]);
 });

Route::get("/modificar_varios_dos", function() {
    Articulo::where("seccion", "Oeste")
            ->where("pais_origen", "España")
            ->update(["precio" =>"99.99"]);
 });

Borrar:
Route::get("/borrar", function() {
    $articulo = Articulo::find(6);
    $articulo->delete();
});

Route::get("/borrar_dos", function() {
    Articulo::where("seccion", "Oeste")
            ->where("pais_origen", "España")
            ->delete();
});

Si al hacer un delete() no queremos q lo borre definitivamente sino que haga un softDelete es muy fácil
Seguir las instrucciones de:
use Illuminate\Database\Eloquent\SoftDeletes;

Dentro de la clase de nuestro modelo:
use SoftDeletes;

Crear una migración para add ese nuevo campo a la tabla:
Schema::table('articulos', function (Blueprint $table) {
    $table->softDeletes();
});

Ejecutar esa nueva migración (php artisan migrate)

 Más ejemplos en:
https://laravel.com/docs/5.0/eloquent

Modelos

Los modelos se guardan en /app/

php artisan make:model Premiados
Crear con el phpmyadmin una nueva tabla por ejemplo "premiados" y rellenarla con algún dato.

En el app/Premiados añadir:
protected $table = "premiados";
// protected fillable es para evitar modificar campos q no queremos que se inserten modifiquen
// funciona cuando se hace con Articulo::create (si se hace creando nueva instancia y con save si q permite todos)
protected $fillable = ['nom_premiado', 'foto_premiado'];

El id de nuestra tabla SIEMPRE se tiene que llamar id pero si no se llamase así se tiene que especificar de esta manera:
protected $primaryKey = "articulos_id";

Por ejemplo en el controlador de la portada sacar los datos, poner en PortadaController.php:
use App\Premiados;
...
public function index() {
   $premiados = Premiados::orderByRaw('RAND()')->limit(6)->get();
   return view('portada.list_premiados', compact('premiados'));
}


Y en la vista \resources\views\portada\list_premiados.blade.php:
@foreach ($premiados as $clave=>$item)
{{ $item->nom_premiado }}<br>
{{ $item->foto_premiado }}
@endforeach