entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

error en consulta Mysql al rellenar una tabla que se mostrara en el sitio web

hola buenos dias, lo que trato de hacer es llamara el nombre de la empresa y el del usuario para mostrarlo en una tabla contenido en index pero me sale este error de la consulta espero y puedan ayudarme

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'empresas.perfil_id' in 'where clause' (SQL: select * from `empresas` where `empresas`.`perfil_id` = 57 and `empresas`.`perfil_id` is not null limit 1) (View: C:\xampp\htdocs\tienda-master\resources\views\auth\index.blade.php).

esta es la tabla que quiero rellenara y en los campos que quiero mostara son de la tabala user el nombre y de la tabala empresa el nombre esas variables estan definidas en mi controlador... que se ve mas abajo..


<div class="table-responsive">
                        <table class="table table-striped table-bordered table-hover">
                            <thead>
                                <tr>
                                    <th>Usuario</th>
                                    <th>Empresa</th>
                                    <th>Alta Producto o servicio</th>
                                    <th>Alta de kits</th>
                                    <th>Alta de garantias</th>
                                    <th>Traspasos</th>
                                    <th>Kardex</th>

                                </tr>
                            </thead>
                            <tbody>
                               @foreach($perfil as $perfils)
                                <tr>
                                    <td>{{ $perfils->user->name}}</td>
                                    <td>{{ $perfils->empresas->name }}</td>
                                    <td>{{ $perfils->alta_p_s }}</td>
                                    <td>{{ $perfils->alta_kits }}</td>
                                    <td>{{ $perfils->alta_garantia }}</td>
                                    <td>{{ $perfils->traspasos }}</td>
                                    <td>{{ $perfils->kardex }}</td>

                                    <td>
                                    <a  class="btn btn-primary">
                                        <i class="fa fa-pencil-square-o"></i>
                                    </a>
                                </td>
                            </tr>
                        @endforeach

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Http\Requests;
use App\Http\Controllers\Controller;
use App\Perfil;
use App\Empresas;
use App\User;

class PerfilController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        $user = User::orderBy('id', 'desc')->lists('name', 'id');
        $empresas = Empresas::orderBy('id', 'desc')->lists('name', 'id');
        $perfil = Perfil::orderBy('id', 'desc')->paginate(5);

        return view('auth.perfil',compact('perfil','user', 'empresas'));
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()

    {
        $user = User::orderBy('id', 'desc')->lists('name', 'id');
        $empresas = Empresas::orderBy('id', 'desc')->lists('name', 'id');
         $perfil = Perfil::orderBy('id', 'desc')->paginate(7);
        return view( 'auth.index',compact('perfil','user', 'empresas'));

    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
       $data = [

                'alta_p_s'      => $request->get('alta_p_s'),        
                'alta_kits'     => $request->get('alta_kits'),       
                'alta_garantia' => $request->get('alta_garantia'),  
                'traspasos'     => $request->get('traspasos'),      
                'kardex'        => $request->get('kardex'), 
                'user_id'       => $request->get('user_id'), 
                'empresa_id'    => $request->get('empresa_id')

        ];

        $perfil = Perfil::create($data);

        $message = $perfil? 'Perfil agregado correctamente!' : 'El perfil NO pudo agregarse!';

        return redirect()->route('perfil.create.index')->with('message', $message);
    }

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show(Perfil $perfils)
    {
        //
        return $perfils;
    }

    /**

espero y puedan ayudarme

ErrorException in Connection.php line 651:
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'empresas.perfil_id' in 'where clause' (SQL: select * from `empresas` where `empresas`.`perfil_id` = 64 and `empresas`.`perfil_id` is not null) (View: C:\xampp\htdocs\tienda-master\resources\views\auth\index.blade.php)
in Connection.php line 651
at CompilerEngine->handleViewException(object(QueryException), '1') in PhpEngine.php line 44
at PhpEngine->evaluatePath('C:\xampp\htdocs\tienda-master\storage\framework\views/0316f17c9c7474e6582b2f41b13cdfc0', array('__env' => object(Factory), 'app' => object(Application), 'errors' => object(ViewErrorBag), 'perfil' => object(LengthAwarePaginator), 'user' => object(Collection), 'empresas' => object(Collection))) in CompilerEngine.php line 58
at CompilerEngine->get('C:\xampp\htdocs\tienda-master\resources\views/auth/index.blade.php', array('__env' => object(Factory), 'app' => object(Application), 'errors' => object(ViewErrorBag), 'perfil' => object(LengthAwarePaginator), 'user' => object(Collection), 'empresas' => object(Collection))) in View.php line 135
at View->getContents() in View.php line 106
at View->renderContents() in View.php line 80
at View->render() in Response.php line 51
at Response->setContent(object(View)) in Response.php line 202
at Response->__construct(object(View)) in Router.php line 1225
at Router->prepareResponse(object(Request), object(View)) in ControllerDispatcher.php line 113
at ControllerDispatcher->Illuminate\Routing\{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 139
at Pipeline->Illuminate\Pipeline\{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 103
at Pipeline->then(object(Closure)) in ControllerDispatcher.php line 114
at ControllerDispatcher->callWithinStack(object(PerfilController), object(Route), object(Request), 'create') in ControllerDispatcher.php line 69
at ControllerDispatcher->dispatch(object(Route), object(Request), 'App\Http\Controllers\PerfilController', 'create') in Route.php line 201
at Route->runWithCustomDispatcher(object(Request)) in Route.php line 134
at Route->run(object(Request)) in Router.php line 704
at Router->Illuminate\Routing\{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 139
at Pipeline->Illuminate\Pipeline\{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 103
at Pipeline->then(object(Closure)) in Router.php line 706
at Router->runRouteWithinStack(object(Route), object(Request)) in Router.php line 671

modelo:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Empresas extends Model
{
        protected $table = 'empresas';

    protected $fillable = ['name', 'rfc', 'calle', 'no_int', 'no_exte', 'colonia', 'c_p', 'estado', 'pais', 'municipio'];
        public $timestamps = false;  
    //
}

y modelo del perfil

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Perfil extends Model
{
    protected $table = 'perfil';

    protected $fillable = ['alta_p_s','alta_kits','alta_garantia','traspasos','kardex','user_id', 'empresa_id'
        ];

        public $timestamps = false; 

    // Relacion con Category
    public function user()
    {
        return $this->belongsTo('App\User');
    }

    // Relacion con  User
    public function empresas()
    {

        return $this->hasMany('App\Empresas');
    }
}

white comentado Oct 22, 2015

existe la columna perfil_id en tu tabla empresas? tal vez estas realizando una relación en tu modelo sin existir una clave foránea o una columna de relación.

intenta colocar el código de tu modelo Empresas, así como colocar el stacktrace completo del error, en tu pregunta no veo donde se puede estar queriendo obtener la columna perfil_id de la tabla empresas.

guatemala12 comentado Oct 22, 2015

ese esel error y los modelos

i no estoy llamando al id de perfil si no el nombre de la tabal empresas el nombre de la empresa y de la usuarios el nombre del usuario es solo eso

1 Respuesta

2votos

white Puntos75620

Estas haciendo una relación one to many en tu model Perfil hacia el modelo Empresa, pero no conozco la estructura de tu base de datos,

con ese tipo de relación debes tener tus tablas de esta forma:

tabla empresas:

|-------|--------------|------|
|   id  |  perfil_id   | name |
|-------|--------------|------|

tabla perfil:

|----------------------|--------------|----------|
|   id  |  alta_p_s    |  alta_kits   |  etc ... |
|-------|--------------|--------------|----------|

es asi?


creo que lo que requieres es una relación inversa.

intenta crear en una migración una tabla que relacione a la tabla perfil y empresas, debe tener 2 columnas como minimo

perfil_id y empresa_id

en tu migración:

Schema::create('perfil_empresa', function (Blueprint $table) {
    $table->integer('perfil_id')->unsigned();
    $table->integer('empresa_id')->unsigned();

    $table->foreign('perfil_id')
        ->references('id')->on('perfil')
        ->onUpdate('cascade')
        ->onDelete('cascade');

    $table->foreign('empresa_id')
        ->references('id')->on('empresas')
        ->onUpdate('cascade')
        ->onDelete('cascade');

    $table->primary(['perfil_id', 'empresa_id']);
});

de esta forma en tu modelo Perfil puedes usar esta relación:

public function empresas()
{

    return $this->belongsToMany('App\Empresas');
}

no es el tipo de relación que necesitas? entonces cuentanos más sobre que tipo de relación es la que buscas.

guatemala12 comentado Oct 23, 2015

tabla empresas

-------|--------------|------|
|   id |      name    | rfc  | etc....
|------|--------------|------|

tabla perfil:

|-------|--------------|--------------|-----------|
|   id  |  empresa_id  |    user_id   | alta_kits | etc ...
|-------|--------------|--------------|-----------|

esa es la relación la tabla perfil contiene la relación con la tabla user y empresas. he intento traer el nombre de la empresa y del usuario por medio de esa relación, llamo los id de las tablas user y empresas si me los muestra, el nombre con relación a esos id ya no, que vendría ciendo el nombre de la empresa y del userio

ejemplo

<tbody>
                               @foreach($perfil as $perfils)
                                <tr>
                                    <td>{{ $perfils->user_id}}</td>
                                    <td>{{ $perfils->empresa_id }}</td>
                                    <td>{{ $perfils->alta_p_s }}</td>
                                    <td>{{ $perfils->alta_kits }}</td>
                                    <td>{{ $perfils->alta_garantia }}</td>
                                    <td>{{ $perfils->traspasos }}</td>
                                    <td>{{ $perfils->kardex }}</td>

                                    <td>
                                    <a  class="btn btn-primary">
                                        <i class="fa fa-pencil-square-o"></i>
                                    </a>
                                </td>
                            </tr>
                        @endforeach

estos datos si me los muestra pero necesito el nombre no el id pero aun NO LO CONSIGO,

white comentado Oct 24, 2015

Según la estructura de tus tablas, tú relación no es de uno a muchos, sino más bien one to one

intenta que tú modelo Perfil luzca así:

<?php

nam
espace App;

use Illuminate\Database\Eloquent\Model;
use App\User;
use App\Empresa;

class Perfil extends Model
{
    protected $table = 'perfil';

    public function user()
    {
        return $this->belongsTo(User::class);
    }

    public function empresa()
    {
        return $this->belongsTo(Empresa::class);
    }
}

en tu vista puedes mostrar los datos así:

@foreach($perfil as $perfils)
    <div>
        <strong>{{$perfils->user->name}}</strong>
        <span> esta en la empresa con nombre: </span>
        <strong>{{$perfils->empresa->name}}</strong>
        <span> con id: </span>
        <strong>{{$perfils->empresa->id}}</strong>
    </div>
@endforeach

si lo que buscas es una relación one to many, entonces crea una tabla como te mencione en mi comentario anterior, en lugar de usar una columna "empresa_id" en tu tabla perfil.

guatemala12 comentado Oct 26, 2015

solo falta que me muestre el nombre de la empresa.

guatemala12 comentado Oct 26, 2015

este es mi modelo'perfil'

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Perfil extends Model
{
protected $table = 'perfil';

protected $fillable = ['alta_p_s','alta_kits','alta_garantia','traspasos','kardex','user_id', 'empresa_id'
    ];

    public $timestamps = false; 

// Relacion con User
public function user()
{
    return $this->belongsTo('App\User');
}

// Relacion con  Empresas
public function empresas()
{

    return $this->belongsTo('App\Empresas');
}

}

y esto es lo que me muestra

                            <tr>
                                <td>{{ $perfils->user->name}}</td>
                                <td>{{ $perfils->empresa_id }}</td>
                                <td>{{ $perfils->alta_p_s }}</td>
                                <td>{{ $perfils->alta_kits }}</td>
                                <td>{{ $perfils->alta_garantia }}</td>
                                <td>{{ $perfils->traspasos }}</td>
                                <td>{{ $perfils->kardex }}</td>

                            <td>

white comentado Oct 26, 2015

y no puedes acceder al atributo empresa?

<td>{{ $perfils->empresa->name }}</td>

guatemala12 comentado Oct 26, 2015

no funciona, estoy utilizando el mismo procedimiento para otra tabla de usuario y si funciona, pero no con esta de empresa.

white comentado Oct 26, 2015

intentaste con with?

$perfil = Perfil::with('empresa')->orderBy('id', 'desc')->paginate(7);

guatemala12 comentado Oct 26, 2015

este es el error que me sale con whit ni siquiera ME DEJA VER LA VISTA CON WITH

Call to undefined method Illuminate\Database\Query\Builder::empresa()

white comentado Oct 26, 2015

tu método debería llamarse empresa más no empresas.

intenta cambiar el nombre de tu método:

public function empresa()
{
    return $this->belongsTo('App\Empresas');
}

$perfil = Perfil::with('empresa')->orderBy('id', 'desc')->paginate(7);

{{ $perfils->empresa->name }}

un consejo adicional, la convención para los modelos dice que uses un singular en el nombre, es decir que tu modelo debería ser Empresa y no Empresas

guatemala12 comentado Oct 27, 2015

si tienes razón mi amigo muchas gracias por los consejos

Por favor, accede o regístrate para responder a esta pregunta.

¿Conoces alguien que puede responder?
¡Comparte esta pregunta!


Otras Preguntas y Respuestas


Actividad Reciente

...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta