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

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

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

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

Laravel 5

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

Q&A

解決済

3回答

1410閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

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

Laravel 5

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

0グッド

0クリップ

投稿2017/09/18 00:19

編集2017/09/18 00:29

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 .

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

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 05:15

fagai

総合スコア2158

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/09/18 05: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が定義出来てないと返ってきて(????)となっています・・・。
fagai

2017/09/18 05:50 編集

nullが返ってくるのは一致するデータが無いときなので問題ないかなと思います。ソースを見るとわかります。基本的に問題になるのは例外が投げられてエラーになるほうです。 もちろん、一致するデータが無かったらnullが返ってくるのでそこからarticlesを取得なんてできません。 データが存在する時は $user->articles()->count(); でも駄目ですか? articles()とarticlesの違いはわかりますか?articles()はそのままメソッドを呼んでそれを返しますが、articlesの場合はオブジェクトのプロパティを取得しようとします。
退会済みユーザー

退会済みユーザー

2017/09/18 05:58

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

2017/09/18 06:05

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

退会済みユーザー

2017/09/18 06:15

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

2017/09/18 06:26

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

退会済みユーザー

2017/09/18 11: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を使って動くまで直していこうと思います。
guest

0

ベストアンサー

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 01:49

編集2017/09/18 07:31
aro10

総合スコア4106

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/09/18 05:12 編集

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

2017/09/18 07:32

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

退会済みユーザー

2017/09/18 11:56

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

0

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

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

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

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

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

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

投稿2017/09/18 01:12

mtdsnsk

総合スコア789

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/09/18 05: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 と返ってきます。 このような場合どこをどう見直せばいいでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問