Laravelよくわかってない人がmake:migrationしてテーブルがよびだせるか確認してQueryExceptionをくらった。
$ php artisan tinker
>>> DB::table(‘tablenm’)->get();
■ 返答
Illuminate/Database/QueryException with message ‘SQLSTATE[42S02]: Base table or view not found: 1146 Table ‘dbnm.tablenm’ doesn’t exist (SQL: insert into tablenm (text) values (Insert))’
ざっくりテーブルまたはビューがないとのこと。テーブルがないだって!!
環境はMac El capitan、MySQL5.6 (ここが原因でした)
テーブルを確認する
「php artisan make:migration テーブル名 」で作っただけでは枠ができている状態で実際にMySQL上にテーブルができていないらしい。
MySQLでテーブルの確認をしてみる。
mysql -u user名 -p;
mysql> SHOW TABLES FROM DB_Name;
+——————-+
| Tables_in_DB_Name|
+——————-+
| migrations |
| users |
+——————-+
作ったテーブルがいない。言われたとおりですね。
php artisan migrateする
php artisan migrateでテーブルが作成されるらしいので、実行。
php artisan migrate
長めの嫌なメッセージを受け取る。
Migrating: 2014_10_12_000000_create_users_table
Illuminate\Database\QueryException
SQLSTATE[42S01]: Base table or view already exists: 1050 Table ‘users’ already exists (SQL: create table `users` (`id` bigint unsigned not null auto_increment primary key, `name` varchar(255) not null, `email` varchar(255) not null, `email_verified_at` timestamp null, `password` varchar(255) not null, `remember_token` varchar(100) null, `created_at` timestamp null, `updated_at` timestamp null) default character set utf8mb4 collate ‘utf8mb4_unicode_ci’)
at vendor/laravel/framework/src/Illuminate/Database/Connection.php:671
667| // If an exception occurs when attempting to run a query, we’ll format the error
668| // message to include the bindings with SQL, which will make this exception a
669| // lot more helpful to the developer instead of just the database’s errors.
670| catch (Exception $e) {
> 671| throw new QueryException(
672| $query, $this->prepareBindings($bindings), $e
673| );
674| }
675|
+9 vendor frames
10 database/migrations/2014_10_12_000000_create_users_table.php:24
Illuminate\Support\Facades\Facade::__callStatic(“create”)
+22 vendor frames
33 artisan:37
Illuminate\Foundation\Console\Kernel::handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
とりあえず存在しているはずのusers テーブルが再実行されてしまい、もういるよと言っていると解釈。
自分が作ったmigrationには実行されなかったらしい。どうすれば実行されるのか。既存のファイル消し去ったらいいのかしら。
php artisan config:cache してみる
php artisan config:cacheでキャッシュを消してみる。変化なし。それもそうか。
とにかく自分で作ったmigrationを認識していないらしい。設定漏れっぽいな。
php artisan migrate:fresh してみる
php artisan migrate:fresh するとテーブルの中身とか全て消えるらしいけど、関係ないので実行。
Dropped all tables successfully.
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Illuminate\Database\QueryException
SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes (SQL: alter table `users` add unique `users_email_unique`(`email`))
at vendor/laravel/framework/src/Illuminate/Database/Connection.php:671
667| // If an exception occurs when attempting to run a query, we’ll format the error
668| // message to include the bindings with SQL, which will make this exception a
669| // lot more helpful to the developer instead of just the database’s errors.
670| catch (Exception $e) {
> 671| throw new QueryException(
672| $query, $this->prepareBindings($bindings), $e
673| );
674| }
675|
+9 vendor frames
10 database/migrations/2014_10_12_000000_create_users_table.php:24
Illuminate\Support\Facades\Facade::__callStatic(“create”)
+34 vendor frames
45 artisan:37
Illuminate\Foundation\Console\Kernel::handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
Migrating: 2014_10_12_000000_create_users_tableでSyntaxエラーがあるらしい。php artisan migrate同じようなメッセージなので確認したほうが良さそう。
これのせいで、新しいmigrationの処理ができてないのかな。
MySQL5.6に対応させる ( 解決 )
上記のSyntaxエラーについて調べたところ、MySQLのバージョンによってSyntaxエラーになるそう。
MySQLのバージョンは5.6で変更することはMacのOS的にできないので以下のように対応。
ファイルのパス : app/Providers/AppServiceProvider.php
太字が追加箇所。
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Schema;
class AppServiceProvider extends ServiceProvider
{
/**
* Register any application services.
*
* @return void
*/
public function register()
{
//
}
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
//
Schema::defaultStringLength(191);
}
}
その他の対応方法や詳細は参考元を確認ください。
参考サイト: Laravel5.4以上、MySQL5.7.7未満 でusersテーブルのマイグレーションを実行すると Syntax error が発生するQitta
再びphp artisan migrate:fresh
php artisan migrate:fresh
■ 返答
Dropped all tables successfully.
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated: 2014_10_12_000000_create_users_table (0.09 seconds)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated: 2019_08_19_000000_create_failed_jobs_table (0.05 seconds)
Migrating: 2020_04_26_141842_作成したテーブル
Migrated: 2020_04_26_141842_作成したテーブル (0.04 seconds)
無事作成された模様。
念のためMySQLでテーブルの確認。
mysql -u user名 -p;
mysql> SHOW TABLES FROM DB_Name;
+——————-+
| Tables_in_DB_Name|
+——————-+
| failed_jobs |
| migrations |
| 追加したテーブル |
| users |
+——————-+
おー増えた。
やりたかったコマンドの実施。
$ php artisan tinker
>>> DB::table(‘tablenm’)->get();
■ 返答
=> Illuminate\Support\Collection {#3019
all: [],
}
おー。まだ何も入ってないからか。
値を追加。
>>> DB::table(‘tablenm’)->insert([‘id’ => ‘001’, “title” => ‘test’, “body” => ‘tesybody’])
成功。ちなみに以下のようなtableデータ。
public function up()
{
Schema::create(‘tablenm’, function (Blueprint $table)
{
$table->increments(‘id’);
$table->string(‘title’);
$table->text(‘body’);
$table->timestamps();
});
}
際実施
>>> DB::table(‘tablenm’)->get();
■ 返答
=> Illuminate\Support\Collection {#3022
all: [
{#3027
+”id”: 1,
+”title”: “test”,
+”body”: “tesybody”,
+”created_at”: null,
+”updated_at”: null,
},
],
}
おー。できた。