SQLSTATE [42S22]: Столбец не найден: 1054 Неизвестный столбец 'id' в 'where clause' (SQL: select * from `songs` где` id` = 5 limit 1)
Я пытаюсь получить конкретные данные из базы данных, используя столбец SongID
когда пользователь нажимает на ссылку, но я получаю эту ошибку:
SQLSTATE [42S22]: Столбец не найден: 1054 Неизвестный столбец "id" в "where clause" (SQL: выбрать * из songs
где id
= 5 limit 1)
Класс контроллера:
<?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;
}
}
Миграция:
public function up()
{
Schema::create('songs', function($table)
{
$table->increments('SongID');
$table->string('SongTitle')->index();
$table->string('Lyrics')->nullable();
$table->timestamp('created_at');
});
}
Ответы
Ответ 1
Когда вы используете find()
, он автоматически предполагает, что ваш первичный столбец будет id
. Чтобы это работало правильно, вы должны установить свой первичный ключ в своей модели.
Итак, в Song.php
внутри класса добавьте строку...
protected $primaryKey = 'SongID';
Если есть какая-либо возможность изменить вашу схему, я бы настоятельно рекомендовал называть все ваши первичные ключевые столбцы id
, это то, что Laravel предполагает и, вероятно, спасет вас от большего количества головных болей по дороге.
Ответ 2
$song = DB::table('songs')->find($id);
здесь вы используете метод find($id)
для Laravel, если вы используете этот метод, вы должны иметь столбец с именем 'id' и установить его как первичный ключ, так что вы сможете использовать метод find()
иначе используйте where('SongID', $id)
вместо find($id)
Ответ 3
Просто зайдите в файл модели соответствующего контроллера и проверьте имя поля первичного ключа
такие как
protected $primaryKey = 'info_id';
здесь info id - это имя поля, доступное в таблице базы данных
Дополнительную информацию можно найти в разделе "Основные ключи" документации.
Ответ 4
protected $primaryKey = 'SongID';
После добавления в мою модель сказать первичный ключ, потому что он по умолчанию принимает идентификатор (SongID)
Ответ 5
извините может помочь эта ошибка
Неустранимая ошибка: необработанное исключение "PDOException" с сообщением "SQLSTATE [42S22]: столбец не найден: 1054 Неизвестный столбец" id "в" предложении where "в C:\xampp\server\swiss_pearl\vendor\j4mie\idiorm\idiorm. php: 505 Трассировка стека: # 0 C:\xampp\server\swiss_pearl\vendor\j4mie\idiorm\idiorm.php(505): PDOStatement-> execute() # 1 C:\xampp\server\swiss_pearl\vendor\j4mie\idiorm\idiorm.php(1909): ORM :: _ execute ('SELECT * FROM'... ', Array,' default ') # 2 C:\xampp\server\swiss_pearl\vendor\j4mie\idiorm\idiorm.php(687): ORM-> _ run() # 3 C:\xampp\server\swiss_pearl\inc\lib.functions.php(34): ORM-> find_one (Array) # 4 C:\xampp\server\swiss_pearl\md_client-edit.php(11): get_item (Array, 'medical_clients') # 5 {main}, брошенный в C:\xampp\server\swiss_pearl\vendor\j4mie\idiorm\idiorm.php в строке 505
Ответ 6
Я использую Laravel 5.8, и у меня возникла та же проблема. Решение, которое сработало для меня, заключается в следующем:
- Я использовал bigIncrements ('id'), чтобы определить мой первичный ключ.
-
Я использовал unsignedBigInteger ('user_id') для определения внешнего ссылочного ключа.
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();
});
Я надеюсь, что это поможет.