nakatievent / my_baby_diary_app

0 stars 0 forks source link

テーブル設計と作成(モデル・コントローラー) #22

Open nakatievent opened 3 years ago

nakatievent commented 3 years ago

テーブル設計について

アプリを作成するに当たって機能から必要になるモデル・コントローラーを考えることにした。 参考:ログイン機能、新規登録機能、投稿機能、お気に入り機能、検索機能

機能から考えて必要な情報は

1. ユーザー情報(名前、メールアドレス、写真、紹介文、性別、管理者権限)
2. 投稿する日記の情報(写真、タイトル、日記)
3. お気に入り(ユーザーID、ポストID、時間)

だと考える。

nakatievent commented 3 years ago

必要なモデル

Userモデル

1. name(string)
2. email(string)
3. picture(string)
4. my_introduction(text)
5. sex(string)
6. admin(boolean)

Postモデル

1. picture(string)
2. title(string)
3. diary(text)

Favoriteモデル

1. user_id(integer)
2. post_id(integer)
3. timestamp

まずはこのくらいにしておく。適宜追加があれば追加する。

nakatievent commented 3 years ago

必要なコントローラー

Usersコントローラー

1. index
2. show
3. new
4. create
5. edit
6. update
7. destroy

Postsコントローラー

1. index
2. show
3. new
4. create
5. edit
6. update
7. destroy

Favoritesコントローラー

index
create
destroy

まずはこのくらいにしておく。適宜追加があれば追加する。

nakatievent commented 3 years ago

モデルとテーブルの作成

まずはモデルを設定していく。

docker-compose exec app bashでコンテナ内に入りphp artisan make:model Userでモデルを作成していくと下記のエラーが発生した。

   InvalidArgumentException

  A CreateUsersTable class already exists.

初期の段階からすでに作られているっぽい。。。

であれば、最初から作成されているusersテーブルにカラムを追加していく。

その後、いったんexitでappコンテナを抜けて、docker-compose exec db bashでデータベースコンテナに入り、

+-------------------+-----------------+------+-----+---------+----------------+
| 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)カラムを追加していく。

nakatievent commented 3 years ago

Postモデルとpostsテーブルの作成

モデルの作成の仕方をググっていたところ、php artisan make:model Post -mと入力するとモデルとそれに関連するマイグレーションファイルを作成してくれるというので実行し、無事モデルとテーブルが作成された。

-mオプションで関連するマイグレーションファイルを作成するらしい。

作成されたテーブルに

$table->string('picture');
$table->string('title');
$table->text('diary');

を追加し、php artisan migrateするとマイグレーションに成功した!

nakatievent commented 3 years ago

Favoriteモデルとfavoritesテーブルの作成

同じように、上記モデルとテーブルを作成していく。

php artisan make:model Favorite -mで作成し、マイグレーションファイルの中に

$table->integer('user_id');
$table->integer('post_id');

を追加しphp artisan migrateを実行する。

nakatievent commented 3 years ago

各種コントローラーを作成

php artisan make:controller UserController --resource

php artisan make:controller PostController --resource

php artisan make:controller FavoriteController --resource

--resourceをつけることで、CRUD処理を実行するアクションを一気に作成することができる。

nakatievent commented 3 years ago

リソースコントローラにより処理されるアクションの確認

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        |
+--------+-----------+-------------------+---------------+---------------------------------------------+------------+

となっていることを確認する。

nakatievent commented 3 years ago

ユーザーコントローラーの記入

<?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');
    }
}
nakatievent commented 3 years ago

ポストコントローラーの記入

<?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');
    }
}
nakatievent commented 3 years ago

カラムの変更(*null許容)

カラムを変更する前に、Composerパッケージマネージャーを使用してdoctrine/dbalパッケージをインストールする必要があります。DoctrineDBALライブラリは、カラムの現在の状態を判別し、カラムに要求された変更を加えるために必要なSQLクエリを作成するのに使用します。

composer require doctrine/dbaldoctrine/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

下記の記事を参考に、エラーを解決した。

  1. 【PHP】Allowed memory size of *** bytes exhaustedエラーの対処法まとめ
  2. Mac環境のphp.iniを修正する方法
  3. composer requireで"Allowed memory size of 1610612736 bytes exhausted"エラーが出た場合の対処法

再度composer require doctrine/dbalを実行すると、無事インストールできた!

下記の記事を参考に、カラムにnullを許容する。

LaravelのMigrateでカラムにNULLを許容したり許容しなかったり変更