Open nakatievent opened 3 years ago
1. name(string)
2. email(string)
3. picture(string)
4. my_introduction(text)
5. sex(string)
6. admin(boolean)
1. picture(string)
2. title(string)
3. diary(text)
1. user_id(integer)
2. post_id(integer)
3. timestamp
まずはこのくらいにしておく。適宜追加があれば追加する。
1. index
2. show
3. new
4. create
5. edit
6. update
7. destroy
1. index
2. show
3. new
4. create
5. edit
6. update
7. destroy
index
create
destroy
まずはこのくらいにしておく。適宜追加があれば追加する。
まずはモデルを設定していく。
docker-compose exec app bash
でコンテナ内に入りphp artisan make:model User
でモデルを作成していくと下記のエラーが発生した。
InvalidArgumentException
A CreateUsersTable class already exists.
初期の段階からすでに作られているっぽい。。。
であれば、最初から作成されているusers
テーブルにカラムを追加していく。
php artisan make:migration add_picture_to_users_table --table=users
でマイグレーションファイルを作成し、$table->string('picture');
を記入してphp artisan migrate
で設定を反映し、php artisan migrate:status
でマイグレーションの反映状況を確認する。その後、いったんexit
でappコンテナを抜けて、docker-compose exec db bash
でデータベースコンテナに入り、
mysql -u $MYSQL_USER -p$MYSQL_PASSWORD $MYSQL_DATABASE
でデータベースに接続(ログイン)し、desc users;
でusersテーブルの中身を確認すると+-------------------+-----------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------------+-----------------+------+-----+---------+----------------+
| id | bigint unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(255) | NO | | NULL | |
| email | varchar(255) | NO | UNI | NULL | |
| email_verified_at | timestamp | YES | | NULL | |
| password | varchar(255) | NO | | NULL | |
| remember_token | varchar(100) | YES | | NULL | |
| created_at | timestamp | YES | | NULL | |
| updated_at | timestamp | YES | | NULL | |
| picture | varchar(255) | NO | | NULL | |
+-------------------+-----------------+------+-----+---------+----------------+
9 rows in set (0.01 sec)
となっていたので反映に成功したことを確認する。
同じように、usersテーブルにmy_introduction(text)カラム
を追加していく。
モデルの作成の仕方をググっていたところ、php artisan make:model Post -m
と入力するとモデルとそれに関連するマイグレーションファイルを作成してくれるというので実行し、無事モデルとテーブルが作成された。
-m
オプションで関連するマイグレーションファイルを作成するらしい。
作成されたテーブルに
$table->string('picture');
$table->string('title');
$table->text('diary');
を追加し、php artisan migrate
するとマイグレーションに成功した!
同じように、上記モデルとテーブルを作成していく。
php artisan make:model Favorite -m
で作成し、マイグレーションファイルの中に
$table->integer('user_id');
$table->integer('post_id');
を追加しphp artisan migrate
を実行する。
php artisan make:controller UserController --resource
php artisan make:controller PostController --resource
php artisan make:controller FavoriteController --resource
--resource
をつけることで、CRUD処理
を実行するアクションを一気に作成することができる。
use App\Http\Controllers\UserController;
use App\Http\Controllers\PostController;
Route::resources([
'users' => UserController::class,
'posts' => PostController::class,
]);
上記のコードをroute/web.php
に記入することで、アクションを処理するための様々なルートを確認することができる。
php artisan route:list
でメソッドやアクション、ルーティングを確認する。
+--------+-----------+-------------------+---------------+---------------------------------------------+------------+
| Domain | Method | URI | Name | Action | Middleware |
+--------+-----------+-------------------+---------------+---------------------------------------------+------------+
| | GET|HEAD | / | | Closure | web |
| | GET|HEAD | api/user | | Closure | api |
| | | | | | auth:api |
| | GET|HEAD | posts | posts.index | App\Http\Controllers\PostController@index | web |
| | POST | posts | posts.store | App\Http\Controllers\PostController@store | web |
| | GET|HEAD | posts/create | posts.create | App\Http\Controllers\PostController@create | web |
| | GET|HEAD | posts/{post} | posts.show | App\Http\Controllers\PostController@show | web |
| | PUT|PATCH | posts/{post} | posts.update | App\Http\Controllers\PostController@update | web |
| | DELETE | posts/{post} | posts.destroy | App\Http\Controllers\PostController@destroy | web |
| | GET|HEAD | posts/{post}/edit | posts.edit | App\Http\Controllers\PostController@edit | web |
| | GET|HEAD | users | users.index | App\Http\Controllers\UserController@index | web |
| | POST | users | users.store | App\Http\Controllers\UserController@store | web |
| | GET|HEAD | users/create | users.create | App\Http\Controllers\UserController@create | web |
| | GET|HEAD | users/{user} | users.show | App\Http\Controllers\UserController@show | web |
| | PUT|PATCH | users/{user} | users.update | App\Http\Controllers\UserController@update | web |
| | DELETE | users/{user} | users.destroy | App\Http\Controllers\UserController@destroy | web |
| | GET|HEAD | users/{user}/edit | users.edit | App\Http\Controllers\UserController@edit | web |
+--------+-----------+-------------------+---------------+---------------------------------------------+------------+
となっていることを確認する。
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\User;
class UserController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
$users = User::all();
return $users;//
}
/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
public function create()
{
$user = new User;
// $requestにformからのデータが格納されているので、以下のようにそれぞれ代入する
$user->title = $request->title;
$user->body = $request->body;
// 保存
$user->save();
// 保存後 一覧ページへリダイレクト
return redirect('/articles');
//
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
//
}
/**
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
{
// 引数で受け取った$idを元にfindでレコードを取得
$users = User::find($id);
// viewにデータを渡す
return view('users.show', ['user' => $user]);
}
/**
* Show the form for editing the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function edit($id)
{
$user = User::find($id);
return view('users.edit', ['user' => $user]);
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(Request $request, $id)
{
// idを元にレコードを検索して$userに代入
$user = user::find($id);
// editで編集されたデータを$userにそれぞれ代入する
$user->title = $request->title;
$user->body = $request->body;
// 保存
$user->save();
// 詳細ページへリダイレクト
return redirect("/users/".$id);
}
/**
* Remove the specified resource from storage.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy($id)
{
// idを元にレコードを検索
$user = user::find($id);
// 削除
$user->delete();
// 一覧にリダイレクト
return redirect('/users');
}
}
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\Post;
class PostController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
$posts = Post::all();
return $posts;//
}
/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
public function create()
{
$post = new Post;
// $requestにformからのデータが格納されているので、以下のようにそれぞれ代入する
$post->title = $request->title;
$post->body = $request->body;
// 保存
$post->save();
// 保存後 一覧ページへリダイレクト
return redirect('/articles');
//
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
//
}
/**
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
{
// 引数で受け取った$idを元にfindでレコードを取得
$posts = Post::find($id);
// viewにデータを渡す
return view('posts.show', ['post' => $post]);
}
/**
* Show the form for editing the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function edit($id)
{
$post = Post::find($id);
return view('posts.edit', ['post' => $post]);
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(Request $request, $id)
{
// idを元にレコードを検索して$postに代入
$post = Post::find($id);
// editで編集されたデータを$postにそれぞれ代入する
$post->title = $request->title;
$post->body = $request->body;
// 保存
$user->save();
// 詳細ページへリダイレクト
return redirect("/users/".$id);
}
/**
* Remove the specified resource from storage.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy($id)
{
// idを元にレコードを検索
$post = post::find($id);
// 削除
$post->delete();
// 一覧にリダイレクト
return redirect('/posts');
}
}
カラムを変更する前に、Composerパッケージマネージャーを使用してdoctrine/dbalパッケージをインストールする必要があります。DoctrineDBALライブラリは、カラムの現在の状態を判別し、カラムに要求された変更を加えるために必要なSQLクエリを作成するのに使用します。
composer require doctrine/dbal
でdoctrine/dbalパッケージ
をインストールしようとしたところ下記のエラーが出た。
Fatal error: Allowed memory size of 1610612736 bytes exhausted (tried to allocate 4096 bytes) in phar:///usr/bin/composer/src/Composer/DependencyResolver/RuleWatchGraph.php on line 52
下記の記事を参考に、エラーを解決した。
再度composer require doctrine/dbal
を実行すると、無事インストールできた!
下記の記事を参考に、カラムにnullを許容する。
テーブル設計について
アプリを作成するに当たって機能から必要になる
モデル・コントローラー
を考えることにした。 参考:ログイン機能、新規登録機能、投稿機能、お気に入り機能、検索機能機能から考えて必要な情報は
だと考える。