¿Como mostar campo de otra tabla por medio de llave foránea en laravel?

publicado por: Anonymous

Buenas Estoy haciendo un pequeño proyecto para ir practicando laravel.

En mi proyecto los usuarios pueden hacer recargas por lo cual yo en una vita quiero mostrar el nombre del usuario con toda la información de la recarga , pero no he podido mostrar el nombre.

lo que quiero es mostrar el nombre del usuario el cual esta en otra tabla;

tabla usuarios

public function up()
{
    Schema::create('usuarios', function (Blueprint $table) {
        $table->increments('id');
        $table->string('nombre', 30);
        $table->string('apellidos', 60);
        $table->string('sexo' , 15);
        $table->integer('edad');
        $table->string('correo' , 50)->unique();
        $table->timestamps();
    });
}

tabla recargas

    public function up()
{
    Schema::create('recargas', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('usuario_id')->unsigned();
        $table->decimal('cantidad_recarga' , 8,2);
        $table->dateTime('fecha_recarga');
        $table->timestamps();

        $table->foreign('usuario_id')->references('id')->on('usuarios');
    });
}

Modelo Usuario

class Usuario extends Model
{
   protected $fillable = ['nombre' , 'apellidos' , 'edad' , 'sexo' , 'correo'];

   public function recargas()
  {
    return $this->hasMany('AppRecarga');
  }
}

Modelo Recarga

class Recarga extends Model
{
   public function usuario()
   {
    return $this->belongsTo('AppUsuario');
   }
}

Controlador de Recargas

use IlluminateHttpRequest;
use AppRecarga;

class RecargaController extends Controller
{
/**
 * Display a listing of the resource.
 *
 * @return IlluminateHttpResponse
 */
public function index()
{
    $recargas = Recarga::all();
    return view('recargas.index' , compact('recargas'));
}

La vista donde quiero mostrar los datos

<a class="btn btn-primary" href="{{ route('recargas.create') }}"> Nuevo recarga  </a>
<br>  
<br>
<table class="table table-hover">
  <thead class="thead-dark">
    <th scope="col" >Id</th>
    <th scope="col" >Nombre</th>
    <th scope="col" >Cantida Recarga</th>
    <th scope="col" >Fecha Recarga</th>
    <th scope="col" >Acciones</th>

 </thead>
 <tbody>
    @foreach ($recargas as $recarga) 
       <tr>
         <th scope="row"> {{$recarga->id}} </th>
         <td>  {{-- Aqui quisiero mostrar el nombre --}} </td>
         <td> {{$recarga->cantidad_recarga}} </td>
         <td> {{$recarga->fecha_recarga}} </td>
         <td>             
            <form action="{{ route('recargas.destroy' , $recarga->id) }}" method="POST">
                  <a class="btn btn-success" href="{{ route('recargas.edit', $recarga->id) }}">  Actualizar  </a>

                 {{csrf_field()}}
                 @method('DELETE')
                 <button class="btn btn-danger" type="submit">Eliminar</button>
           </form>

        </td>
     </tr>
  @endforeach

y por ultimo lo que me muestra el navegador

introducir la descripción de la imagen aquí

solución

Veo en la otra respuesta que te muestran la ruta complicada usando joins, esto es totalmente innecesario cuando usas un framework como Laravel (o muchos otros) y tienes a Eloquent además.

Ya tienes las relaciones correctamente definidas entre tus modelos, lo que necesitas es replantear un poco la forma de abordar el problema, lo cual es muy sencillo y voy a retomar tus palabras:

quiero mostrar el nombre del usuario con toda la información de la recarga

Teniendo en cuenta que es el usuario quien tiene muchas recargas, es el dueño de estas, por llamarlo así, y tú mismo le estás dando el orden (con tus palabras) en que debe hacerse la consulta.

Es mucho más fácil partir del usuario «dueño» de las recargas, que intentar partir de una recarga cualquiera y deducir si pertenece a nuestro usuario en cuestión o no.

En la vida real es más fácil preguntarle a alguien cuantas casas tiene, que ir preguntando de casa en casa a quien le pertenece esta.

Yendo a la práctica, cargas los datos de las recargas relacionadas con dicho usuario con Eager Loading, pero siempre partiendo del usuario:

public function index()
{
    $usuarios = User::with('recargas')->get();
    return view('recargas.index' , compact('usuarios'));
}

Y en la vista debes iterar primero a través de los usuarios y luego a través de cada recarga:

@foreach ($usuarios as $usuario)

  @foreach ($usuario->recargas as $recarga)
   <tr>
     <th scope="row"> {{$recarga->id}} </th>
     <td>  {{ $usuario->nombre }} </td>
     <td> {{$recarga->cantidad_recarga}} </td>
     <td> {{$recarga->fecha_recarga}} </td>
     <td>             
        <form action="{{ route('recargas.destroy' , $recarga->id) }}" method="POST">
              <a class="btn btn-success" href="{{ route('recargas.edit', $recarga->id) }}">  Actualizar  </a>

             {{csrf_field()}}
             @method('DELETE')
             <button class="btn btn-danger" type="submit">Eliminar</button>
       </form>

      </td>
   </tr>
  @endforeach

@endforeach
Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *