SQLSTATE[42S22]: Columna no encontrada: 1054 Columna desconocida ‘id’ en ‘cláusula where’ (SQL: seleccione * de ‘canciones’ donde ‘id’ = 5 límite 1)

4 minutos de lectura

avatar de usuario
Sarro

Estoy tratando de obtener datos específicos de la base de datos usando la columna SongID cuando un usuario hace clic en un enlace pero recibo este error:

SQLSTATE[42S22]: Columna no encontrada: 1054 Columna desconocida ‘id’ en ‘cláusula where’ (SQL: seleccione * de songs dónde id = 5 límite 1)

La clase del controlador:

<?php namespace App\Http\Controllers;

use App\Http\Requests;
use App\Http\Controllers\Controller;

use Illuminate\Http\Request;
use DB;

class SongsController extends Controller {
    public function index()
    {
        $name = $this->getName();
        $songs = DB::table('songs')->get();
        return view('songs.index', compact('songs','name'));
    }
    public function show($id)
    {
        $name = $this->getName();
        $song = DB::table('songs')->find($id);
        return view('songs.show', compact('song','name'));
    }

    private function getName()
    {
        $name="Tupac Amaru Shakur";
        return $name;
    }
}

Migración:

    public function up()
    {
            Schema::create('songs', function($table)
            {
                $table->increments('SongID');
                $table->string('SongTitle')->index();
                $table->string('Lyrics')->nullable();
                $table->timestamp('created_at');
            });
    }

  • ¿Cómo se ve el esquema de tu tabla? Obviamente parece que te falta un id columna en su tabla por alguna razón….

    – fuego de seda

    30 de marzo de 2015 a las 13:23

  • No tengo una columna llamada id en mi tabla, en su lugar tengo el SongID

    – sarro

    30 de marzo de 2015 a las 13:25

cuando usas find()asume automáticamente que su columna de clave principal será id. Para que esto funcione correctamente, debe configurar su clave principal en su modelo.

así que en Song.phpdentro de la clase, agregue la línea…

protected $primaryKey = 'SongID';

Si existe alguna posibilidad de cambiar su esquema, le recomiendo nombrar todas sus columnas de clave principal ides lo que asume Laravel y probablemente lo salvará de más dolores de cabeza en el futuro.

  • Es la excelente solución y la mejor respuesta.

    – arefindev

    04/01/2019 a las 18:20

  • Esto también es cierto con los errores que pueda tener con Resource o Collection, ya que Laravel tiende a usar el mismo modelo.

    – Vincent Edward Gedaria Binua

    7 de enero de 2021 a las 9:04

  • Esta solución también se aplica a otros escenarios donde ocurre el mismo error. En mi caso, fue una declaración CreateOrUpdate que falló porque no tenía una clave principal definida y vuelve a verificar por defecto where 'id' is null

    – carne de vacuno

    1 de noviembre de 2021 a las 12:28


avatar de usuario
Manoj Kiran Appathurai

Simplemente vaya al archivo de modelo del controlador correspondiente y verifique el nombre del archivo de clave principal

como

protected $primaryKey = 'info_id';

aquí info id es el nombre del campo disponible en la tabla de la base de datos

Se puede encontrar más información en la sección “Claves principales” de los documentos.

$song = DB::table('songs')->find($id);

aquí usas el método find($id)

para Laravel, si usa este método, debe tener una columna llamada ‘id’ y configurarla como clave principal, para que pueda usar el método find()

de lo contrario usar where('SongID', $id) en vez de find($id)

  • @CJ Suspender esta declaración no devuelve nada de la base de datos.

    – sarro

    30 de marzo de 2015 a las 14:13

  • $song = DB::table('songs')->where('SongID', $id)->first() Eso debería devolver un modelo (siempre que haya algo en su base de datos con esa identificación). Entonces deberías poder obtener la propiedad de eso con $song->SongTitle

    – usuario1669496

    30 de marzo de 2015 a las 14:17

avatar de usuario
GERARD KANDAGOR

protected $primaryKey = 'SongID';

Después de agregar a mi modelo para indicar la clave principal porque estaba tomando id (SongID) de forma predeterminada

Estoy ejecutando laravel 5.8 y experimenté el mismo problema. La solución que funcionó para mí es la siguiente:

  1. Usé bigIncrements(‘id’) para definir mi clave principal.
  2. Usé unsignedBigInteger(‘user_id’) para definir la clave de referencia externa.

        Schema::create('generals', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('general_name');
            $table->string('status');
            $table->timestamps();
        });
    
    
        Schema::create('categories', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->unsignedBigInteger('general_id');
            $table->foreign('general_id')->references('id')->on('generals');
            $table->string('category_name');
            $table->string('status');
            $table->timestamps();
        });
    

Espero que esto ayude.

¿Ha sido útil esta solución?