ユーザーがリンクをクリックしたときに列SongID
を使用してデータベースから特定のデータを取得しようとしていますが、このエラーが発生しています:
SQLSTATE [42S22]:列が見つかりません:1054不明な列 'id' in 'where句'(SQL:select * from
songs
whereid
= 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');
});
}
find()
を使用すると、主キー列がid
になると自動的に想定されます。これが正しく機能するためには、モデルに主キーを設定する必要があります。
したがって、Song.php
で、クラス内に次の行を追加します...
protected $primaryKey = 'SongID';
スキーマを変更する可能性がある場合は、すべてのプライマリキー列にid
という名前を付けることを強くお勧めします。これはLaravelが想定していることであり、今後の頭痛の種から解放されます。
_$song = DB::table('songs')->find($id);
_
ここでは、メソッドfind($id)
を使用します
laravelの場合、このメソッドを使用する場合、「id」という名前の列があり、それを主キーとして設定する必要があります。そのため、メソッドfind()
を使用できます。
それ以外の場合は、where('SongID', $id)
の代わりにfind($id)
を使用します
対応するコントローラーのモデルファイルに移動し、主キーのファイル名を確認するだけです
といった
protected $primaryKey = 'info_id';
ここで、情報IDはデータベーステーブルで使用可能なフィールド名です
詳細については、 ドキュメント の「プライマリキー」セクションを参照してください。
私はlaravel 5.8を実行していますが、同じ問題が発生しました。私のために働いた解決策は次のとおりです:
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();
});
これがお役に立てば幸いです。
protected $primaryKey = 'SongID';
デフォルトでid(SongID)を使用していたため、主キーを伝えるためにモデルに追加した後