Comunidad de diseño web y desarrollo en internet online

Como aplico esta sentencia sql en laravel 4

Citar            
MensajeEscrito el 27 Nov 2013 04:07 am
Les explico tengo mi vista en laravel, la cual me muestra una lista de los productos registrados en la tabla productos(valga la redundancia), aquí el código:

Código PHP :

@extends ('layout')
@section ('title') Lista de Productos @stop
@section ('content')
<div class="row">
<div class="form-group col-md-12">
<h1>Lista de Productos</h1>
<p>
   <a href="{{route('productos.articulo.create')}}" class="btn btn-primary">Nuevo Producto</a>
</p>
</div>
<div class="form-group col-md-8">
<table class="table table-striped">
   <tr>
      <th>Nombre</th>
      <th>Categoria</th>
      <th>Cantidad</th>
   </tr>

   @foreach ($productos as $producto)
   <tr>
      <td>{{$producto->nombre}}</td>
                 //CAMPO CATEGORIA
      <td>{{$producto->idcategorias}}</td> 
      <td>{{$producto->cantidad}}</td>   
            
   </tr>
   @endforeach
      
</table>

</div>

</div>

@stop


Todo bien, solo que yo no quiero que en el campo categoría me salga el ID de la categoría, si no el nombre de la misma, el cual esta almacenado en la tabla categorías esto con sql se que se logra de la siguiente manera:

Código MySQL :

select categorias.nombre
  from categorias, productos
 where productos.idcategorias = categorias.id;


AHORA LA PREGUNTA ES LA SIGUIENTE COMO LOGRO ESTO EN LARAVEL?

Por gilberto286

5 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 27 Nov 2013 11:12 am
Esto se hace muy fácil gracias a Eloquent y sus relaciones:

http://laravel.com/docs/eloquent#relationships

Yo no lo toqué en los tutos pero sería algo como definir en tu modelo de Producto:

Código PHP :

function categoria()
{
    return $this->belongsTo('Categoria', 'idcategorias');
}


Y dentro de la Categoria:

Código PHP :

function producto()
{
   return $this->hasMany('Producto', 'idcategorias');
}


A Laravel le gustaría que tu clave foranea fuese "categoria_id" en vez de "idcategorias" eso haría tu vida más fácil porque Laravel espera categoria_id por defecto... Anyway

luego puedes hacer:

Código PHP :

{{ $producto->categoria->nombre }}


Fíjate que uso categoria sin los paréntesis (). Laravel se encarga de hacer el query por ti.

Para evitar la sobrecarga de queries, en el controlador:

Código PHP :

Producto::with('categoria')->select();


En fin es un tema un poco más avanzado, deberías referirte un poco a la documentación oficial o buscar más documentación en Internet, por último también puedes mandar mensajes al Twitter @freddier al menos 3 veces al día pidiendo un curso de Laravel en mejorando.la, así podría explicar con calma todas esas cosas. (No olvides decirle a todos, TODOS tus amigos y familiares que también le escriban a @freddier :lol: :lol: :lol: )

Saludos!

Por Duilio

Claber

2590 de clabLevel

25 tutoriales
1 articulo

Genero:Masculino   Premio_Secretos

Venezuela

chrome
Citar            
MensajeEscrito el 28 Nov 2013 04:38 am
Gracias Duilio eres un excelente profesor me sirvió de mucho tu ayuda, ahora la única parte que me quede con dudas es cuando dices

Para evitar la sobrecarga de queries, en el controlador:

Código PHP :

Producto::with('categoria')->select();


Me imagino que eso va en el controlador de producto, pero en que sitio en especifico?
y que resultados obtendría con esa linea de código o en maracucho como se diría en mi tierra, pa que sirve esa linea de código? :lol: :lol: :lol:

Por gilberto286

5 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 28 Nov 2013 02:42 pm
Al menos quedaste con la intriga, eso es bueno :)

Código PHP :

Producto::with('categoria')->select();


Sirve para evitar el problema de N+1 queries, esto es:


Tú haces un query (o bueno Laravel / Eloquent en este caso) a la base de datos para traerte todos los productos, cierto?
Pero luego si en una fila dentro del foreach:

Código HTML :

@foreach ($productos as $producto)


Haces:

Código HTML :

{{ $producto->categoria->nombre }}


Laravel va a solicitar otro query a la base de datos para traerse la categoría de dicho producto.

En la próxima vuelta del foreach se vuelve a llamar:

Código HTML :

{{ $producto->categoria->nombre }}


¡PUM! Otro query.

Si tienes 20 productos entonces N+1 queries: 21 queries. 1 para traer los productos, 1 para traer cada categoría de cada producto.

En cambio con:

Código PHP :

Producto::with('Categoria')->all()


Laravel se trae en un query todos los productos, pero además lo que hace es que toma todos los IDs de categorias encontradas en productos y hace un

Código MySQL :

SELECT * from categorias WHERE IN (categoria_id,categoria_id,categoria_id....)


De esta manera se hace sólo un query extra en vez de N+1 queries.

Me alegra poder ayudarte, mucha suerte con esto :)

PD: Por supuesto ese codigo puede ir en cualquier parte, en este caso la idea sería reemplazar Producto::all o Producto::paginate por Producto::with('Categoria')->paginate().

Eso se llama "eager loading" (http://laravel.com/docs/eloquent#eager-loading) en constraste con "lazy loading". (Ahí te dejo un par de términos más para que te de intriga otra vez y los investigues :P)

Saludos!

Por Duilio

Claber

2590 de clabLevel

25 tutoriales
1 articulo

Genero:Masculino   Premio_Secretos

Venezuela

chrome

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.