Eloquent

  • Ya hemos visto algunos ejemplos de métodos disponibles en los modelos Eloquent. Vamos a revisarlos.
  • Todos los registros: $studies= Study::all();
  • Buscar por el id: $studies= Study::find($id);
  • Crear un registro.
    • Como vemos en el ejemplo de arriba. Ojo debemos preparar el modelo ($fillable = ...)
    • O asigando campo a campo
      $study = new Study;
      $study ->code= "IFC303";
      $study ->name = "Desarrollo de aplicaciones web";
      $study ->save();
      }
      
  • Modificar registro:
    public function cambiaNombre($id, $nombre){
      $articulo = Articulo::find($id);
      $articulo->nombre= $nombre;
      $articulo->save();
    }
    
  • Borrar registro
    public function delete($id)
    {
      // modo 1
      $study = Study::find($id);
     $study->delete();
     // modo 2
      Study::destroy($id);
      ...
    }
    
  • Pero además podemos buscar con where, ordenar o limitarnos a n-registros.
    public function index(){
      $studies= Study::where('code', 'like', 'IFC%')
      ->orderBy('code', 'asc')
      ->take(2)
      ->get();
      return view('study.index', [
          'studies' => $studies
      ]);
    }
    

    Fluent Query Builder

    ... o simplemente Fluent.
  • Permite realizar consultas sin usar SQL.
  • Por detrás usa PDO y tiene protecciones contra SQL inyection.
  • Es independiente del SGBD.

    Primeras consultas

  • Debemos usar la fachada DB.
  • Su método table() nos devuelve un objeto fluent.
    $fluent = DB::table('studies');
    
  • Sobre el objeto fluent podemos ejecutar distintos métodos:
    //obtener todos los registros en un array de objetos
    $studies = $fluent->get();
    //sólo el primero, en un objeto único.
    $study = $fluent->first();
    //o todo en una sentencia
    $studies= DB::table('studies')->get();
    $study= DB::table('studies')->first();
    
  • Podemos acceder a los campos de los objetos:
    echo $study->code;
    echo $studies[0]->code;
    

    Select ... where ...

  • Podemos seleccionar sólo algunas columnas.
    $studies = DB::table('studies')->select('name')->get();
    $studies = DB::table(['code', 'studies'])->select('name')->get();
    
  • Añadir condiciones where simples:
    $studies = DB::table('studies')->where('code', '=', 'IFC303')->get();
    
  • Con comodines
    //en una línea o en varias para mejorar la legibilidad
    $studies = DB::table('studies')->where('code', 'like', 'IFC%')->get();
    $studies = DB::table('studies')
      ->where('code', 'like', 'IFC%')
      ->get();
    
  • Usar varios where (AND)
    $studies = DB::table('studies')
      ->where('code', 'like', 'IFC%')
      ->where('name', 'like', '%web')
      ->get();
    
  • Operaciones OR.
    $studies = DB::table('studies')
      ->where('code', 'like', 'IFC%')
      ->orWhere('code', 'like', 'ADG%')
      ->get();
    
  • Pertenencia a un array.
    $studies = DB::table('studies')
      ->whereIn('code', ['IFC302', 'IFC303'])
      ->get();
    
  • Pero existen más posibilidades: whereBetween, whereNotBetween, whereNotIn, whereNull, whereNotNull, whereColumn (compara columnas), whereDate, whereMonth, whereDay, whereYear, ...
  • Para estas y otras posibilidades consultar documentación oficial.

    Multitabla

  • Para unir varias tablas tenemos un juego de métodos join.
  • Producto cartesiano (CROSS JOIN -> join(...))
    $users = DB::table('sizes')
      ->crossJoin('colours')
      ->get();
    
  • Reunión interna (INNER JOIN -> join(...))
    $users = DB::table('users')
      ->join('contacts', 'users.id', '=', 'contacts.user_id')
      ->join('orders', 'users.id', '=', 'orders.user_id')
      ->select('users.*', 'contacts.phone', 'orders.price')
      ->get();
    
  • Reunión externa (LEFT JOIN -> leftJoin(...) y RIGHT JOIN -> rightJoin(...))
    $users = DB::table('users')
      ->leftJoin('posts', 'users.id', '=', 'posts.user_id')
      ->get();
    

    Y mucho más

  • Ordenar

    $users = DB::table('users') 
      ->orderBy('name', 'desc')
      ->get();
    
  • Agrupaciones

    $users = DB::table('users')
      >groupBy('account_id')
      ->having('account_id', '>', 100)
      ->get();
    //algo más elaborado usando algo de sql puro
    ->select('department', DB::raw('SUM(price) as total_sales'))
      ->groupBy('department')
      ->havingRaw('SUM(price) > 2500')
      ->get();
    
  • Inserciones:
    DB::table('users')->insert(
      ['email' => '[email protected]', 'votes' => 0]
    );
    //multiregistro
    DB::table('users')->insert([
      ['email' => '[email protected]', 'votes' => 0],
      ['email' => '[email protected]', 'votes' => 0]
    ]);   
    //tomando el id autoincremental
    $id = DB::table('users')->insertGetId(
      ['email' => '[email protected]', 'votes' => 0]
    );
    
  • Actualizaciones
    DB::table('users')
      ->where('id', 1)
      ->update(['votes' => 1]);
    // pero hay más si quieres investigar:
    DB::table('users')->increment('votes');
    DB::table('users')->decrement('votes', 5);
    
  • Borrados
    DB::table('users')->delete(); //todos los registros
    DB::table('users')->where('votes', '>', 100)->delete();//usando where
    DB::table('users')->truncate();//borra y resetea id autoincrement
    

    Para terminar: toSql

  • Es interesante poder revisar el sql que estamos construyendo:
//en Fluent
$sql = DB::table('studies')
    ->whereIn('code', ['IFC302', 'IFC303'])
    ->toSql();
//...o en Eloquent
$sql = User::where('foo', 'bar')->toSql();
// y después lo vemos
dd($sql);

Raw SQL

  • Debemos usar los métodos select y raw de la clase DB.
$result = DB::select(DB::raw("SELECT * FROM products WHERE family_id = 3"));

Ejercicios Eloquent sobre la base de datos shop17

results matching ""

    No results matching ""