質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

91.02%

  • PHP

    17738questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • Laravel 5

    1440questions

    Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

[Laravel5.1]マイグレーションとDBの不整合を直したい

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 265

yuus2733

score 101

php artisan migrate:refresh
をかけると

 [Illuminate\Database\QueryException]
 SQLSTATE[HY000]: General error: 1 no such table: users (SQL: drop table "us
 ers")

 [PDOException]
 SQLSTATE[HY000]: General error: 1 no such table: users


と返ってきます。
これは、間違えて_add_published_at_to_articles_table.php
を余分に作ってしまって、pupsqliteでデータベースの中をいじっている内に
発生したエラーを読んで、更にいじっていてこうなってしまいました。
composer dump-autoloadの反応

Generating autoload files
Warning: Ambiguous class resolution, "AddPublishedAtToArticlesTable" was found i
n both "C:/Homestead/Laravel5.1/database/migrations/2017_09_11_180020_add_publis
hed_at_to_articles_table.php" and "C:/Homestead/Laravel5.1/database/migrations/2
017_09_18_081213_add_published_at_to_articles_table.php", the first will be used
.


対策になりそうな記事を見て回ったのですが直せません。
一度最初のデータベース設定からやり直したほうがいいのでしょうか。ご教示ください。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+2

Laravelのマイグレーションは、データベースのmigrationsテーブルで管理していて、データ中のmigration列にファイル名が、batch列に取り込んだ履歴番号が保存されているので不正なファイル名の物を手で修正すれば復旧できます。
ファイル名とクラス名の対応は、Illuminate\Database\Migrations\resolveクラスのresolve辺りをみるとわかるかと思います。

[追記]
マイグレーションファイルの整合性が取れなくなってしまった場合は、以下のライブラリを利用することで現在のデータベース構造からマイグレーションファイルを作成してくれるので、既存のマイグレーションファイルを消してから、このライブラリを実行して新しいマイグレーションファイル一式を作成し、migrationsテーブルの旧データを空にして、マイグレーション処理を実行すると問題解決が早いです。
Laravel Migrations Generator

Macであれば、データベースGUI管理ツールのSequelPro用のプラグインも使えます。
既存テーブルからLaravel用のマイグレーションファイルを作成できるsequel-pro用バンドル「sequel-pro-laravel-export」

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/18 14:12 編集

    結局最初の方まで戻ってやり直しました。
    Illuminate\Database\Migrations\resolveクラスのresolveと言うのはどのファイルの事でしょうか・・・初めて見ます。

    キャンセル

  • 2017/09/18 16:32

    回答に、既存データベースからマイグレーションファイルを作成してくれるライブラリの紹介を追記したので、次におかしくなった場合は役立つかもしれません。

    キャンセル

  • 2017/09/18 20:56

    ありがとうございます!
    データベース周りいじるのは余計なことをする、順番間違える(見落として戻ってくる事含めて)、などでの失敗があったのでありがたいです。

    キャンセル

+2

Lara帳を利用していたと思いますので、

1.まずdatabase.sqliteファイルを削除して新規作成し直す
2.2017_09_11_180020_add_published_at_to_articles_table.phpを消す
3.最初の方でarticlesテーブルを作ったmigrationファイルにpublished_atを追加する
4.php artisan migrateを実行する

でどうでしょうか。
あくまでもデータが消えて良い前提ではありますが。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/18 14:32 編集

    毎度毎度、ありがとうございます。
    ちょうど見本でもmigrate:refreshでデータが消える前提だったので、やり直すことにして、今(31)の最後の方、tinkerでのデータ確認の部分をやっていました。
    $user = App\User::where("name", "who")->first();ではnullですし、
    $user->articles->count();では
    PHP error: Trying to get property of non-object on line 1
    と返ってきます。しかしpupsqliteで確認すると記事、ユーザーの追加ともにできています。userが定義出来てないと返ってきて(????)となっています・・・。

    キャンセル

  • 2017/09/18 14:50 編集

    nullが返ってくるのは一致するデータが無いときなので問題ないかなと思います。ソースを見るとわかります。基本的に問題になるのは例外が投げられてエラーになるほうです。

    もちろん、一致するデータが無かったらnullが返ってくるのでそこからarticlesを取得なんてできません。
    データが存在する時は
    $user->articles()->count();
    でも駄目ですか? articles()とarticlesの違いはわかりますか?articles()はそのままメソッドを呼んでそれを返しますが、articlesの場合はオブジェクトのプロパティを取得しようとします。

    キャンセル

  • 2017/09/18 14:58

    $user->articles()->count();でもだめでした。
    tinkerの事を知ったのもLara帳での学習始めてからなのですが、データ取得の書き方などもまったくわかっていません。昨日仰っていたPSRというのを理解すれば、articles()とarticlesの違いも理解できるようになるのでしょうか?

    キャンセル

  • 2017/09/18 15:05

    > 昨日仰っていたPSRというのを理解すれば、articles()とarticlesの違いも理解できるようになるのでしょうか?
    PSRは標準化するためのルールみたいなものなので、関係ありません。
    これに関してはソースを読むとか、Xdebugやpsyshのようなデバッガーを入れてデバッグして理解するとかだと思います。

    キャンセル

  • 2017/09/18 15:15

    今Xdebugとpsyshを検索してみたところ、Homesteadと関連している?事からXdebugの方がいい気がしました。
    一度書店などに出かけたり、休んでから再びやってみます。ありがとうございます。

    キャンセル

  • 2017/09/18 15:26

    Xdebugは最初の設定が上手く行かずにデバッグできなかったりしますが、根気強くやってみてください。

    キャンセル

  • 2017/09/18 20:58 編集

    Xdebugの公式サイトとかいくつか見てみましたが確かに分かりづらいですね・・・時間かかりそうです
    19:39追記:C:\>php -v
    PHP 7.1.8 (cli) (built: Aug 1 2017 21:10:46) ( ZTS MSVC14 (Visual C++ 2015) x86)
    Copyright (c) 1997-2017 The PHP Group
    Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies
    with Xdebug v2.5.4, Copyright (c) 2002-2017, by Derick Rethans
    これでどうやらXdebugは入ったようです。
    これから少しいじってみます。
    とりあえず「はじめてのLaravel5.1(34)」までコピーして少し動かしてみました。
    すると案の定エラーの連続なので、ここからXdebugを使って動くまで直していこうと思います。

    キャンセル

+1

さすがにこの内容だけでは回答できませんが、

一度最初のデータベース設定からやり直したほうがいいのでしょうか

こちらが可能ならそうすれば良いと思います。

基本的に、migrationファイルでDBに変更を加えたものを修正する場合、

  1. 直近のmigrationの場合であればは、migrationをロールバックして、pendingのmigrationファイルを修正してサイドmigrationを実行する
  2. migrationファイルを新たに作成して、取り消す処理を書いて実行する

上記のどちらで対応できるはずです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/18 14:07

    ありがとうございます。
    体調が悪い時にやっていたので変なミスをしたのがきっかけでした。
    なので、一度最初の方に戻ってやり直したのですが、
    php artisan db:seedを実行すると
    [ErrorException]
    Undefined variable: user
    が返ってきたり、tinkerで
    $user = App\User::where("name","who")->first();ではnull,
    $user->articles->count();では
    PHP error: Trying to get property of non-object on line 1
    と返ってきます。
    このような場合どこをどう見直せばいいでしょうか?

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 91.02%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • PHP

    17738questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • Laravel 5

    1440questions

    Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。