備忘録 ーーlaravelにおけるデータベースとルーティングの理解ーー

p●izaで学んだことの備忘録。インデントとか滅茶苦茶だけど許して

# 1.laravelの導入

    　laravel new (プロジェクト名)

５分くらいでできます。

laravelをinstallしましたら、始めに'hello world'と表示させていきましょう。記述させるにはフロントのファイルを弄ればいいですね。
laravelではresouress/views/....にフロントが記述してますのでそこのファイルを弄ればよいです。

さて、laravelはバックエンドで動かす言語です。バックエンドで動かすのなら、SQLに接続できないとだめですね。
そこで.envファイルにある

        DB_DATABASE=mybbs 
        DB_USERNAME=root
        
以上の2点を変更してください。（環境に応じる）

laravel はMVCモデルと呼ぶ処理を実装しています。流れとして下記の図のように、ユーザーからのリクエストを受け、ルーティングで処理先を決定し、コントローラーで処理、モデルでデータベース操作を行い、ビューで表示する...といった流れです。よくわかりませんね、これからじっくりと説明しますね。


![laravel-image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4072459/a758987f-b936-4487-87c1-8e9d30d68f26.png)

# ２.モデルの作製
上記で解説したmvc..要するに役割ごとに分かれており、それぞれの役割ごとに記述する場所が異なるってことですね。ならそのたびにファイルを作製するって？？（そんな面倒なことはし）ないです。実はコマンド一つでできます。ターミナルで

    　php artisan make:model Article(モデルの名前)　-m -c -r 

     これがダメなら

      php ./artisan make:model Article(モデルの名前)　-m -c -r 

とします。今回は便宜上モデルの名前を'Article'としておきます。この際、単数形が望ましいです。上手にできたら

        model create sculley

と出ます。では確認がてらのぞいてみましょう

bbs/app/model/Articleでは

    <?php
    
        namespace App;
    
        use Illuminate\Database\Eloquent\Model;
    
        class Article extends Model
        {
        
        }

bbs/app/Html/Controller/ArticleControllerでは
(略)
更にbbs/database/migrete/以下を覗くと
bbs/database/migrete/xxxxxxxが作製されてます(xxxxxxは日付)
この日付けのやつがデータベースへ反映させるやつです。肝心ですね。
さて、このXXXXのファイルを見てみましょう。関数が沢山ありますね。うちの一つを見ると

    public function up()
     {
         Schema::create('articles', function (Blueprint $table) {
             $table->id();
             $table->timestamps();
         });
     }

Schema::create...以下を見ると名前が自動で反映されてます。はぇーーすっごく便利。ではここでカラムを挿入しましょう

     public function up()
    {
         Schema::create('articles', function (Blueprint $table) {
             $table->id('id');
             $table->string('content');  ※型に注意。
             $table->timestamps();
         });
     }

はい。書いただけです。これでは反映されません。コマンドを打ちましょう。

    php artisan migrate  

これをしないと反映されません。

ではcontentカラムを挿入したので、データを入れていきましょう
同じくbbs/database/migrete/xxxxxxx...内にある　public function up()関数内で

    {
    DB::table('articles')->insert([
        ['content' => 'リンゴ'],
        ['content' => 'バナナ'],
        ['content' => 'オレンジ']
    ]);

と記述しましょう。データが挿入されてるはずです。挿入しましたらデータの更新です。

     php artisan migrate

これでよかったですね。

# ３.ルーティングの作製

先ほどはモデルを作製しました。ですが表を見てください。中心部にあるコントローラーが色々がんばってますね。でもその前にルーティングがいます。
WEBページを思い出してほしいのですが、ページやアドレスごとに処理が異なりますよね？ルーティング君はリクエストを受け取り、その処理を誰に、どこにするのかを司ります。
ではルーティングの設定に参りましょう。

routes/web.phpを確認してください

    Route::get('/', function () {
        return view('welcome');
    });

とあるはずです。
ここのファイルに更に

    Route::get('/articles', 'ArticleController@index')->name('article.list');
    
と記入します。
ここの->name('article.list')..はアプリケーションの中で参照するときの名前です。name（）...で名前を付けたのですね。名前を付ける事でページの偏移が楽になります。
phpのformのactrionなんかにこの名前を入力するとそこに飛べます。いいですね
また初期設定として、Laravelのアプリケーション内で全てのURLをHTTPSに強制させたいので

app/Providers/AppServiceProviderのfunction Boot() に

     public function boot()
     {
         URL::forceSchema('https');
     }
     
とします。これで良しです。

ここでundefined type 'URL'. laravel　と出るなら　

    use Illuminate\Support\Facades\URL;

と追加してください。収まります
    
# ４.コントローラーとビューの作成
コントローラーはHTTPリクエストを受け取りそのアクションを行います。ページの偏移やデータベース関連などです。大忙しです。
ビューはフロント領域です

では手始めにページの偏移から行きましょう。
app/Http/Controller/ArticleContolloerより

    public function index()
     {
         return view('index');
     }

はい。これでviewのindexを返すようになりました。
では//bbs/resources/viewsより、index.blade.php を作製しましょう。index.blade.php..に

    <a>hello</a>

と記入して
    localhost:XXXX/articles

とすれば'hello'と出ます。ここでなんで'localhost:XXXX/articles'　とお思いの方もいますが、routes/web.phpの Route::get('/articles', ...@index..　で制定
してますね。で、/ArticleContolloer...でindexを実行するとview('index');と返すとなってます。ここら辺は実感しにくいですが解るとなるほどーーとなりますので根気よく頑張りましょう。
さて、ページが偏移するだけではつまらないですね。せっかくですから欲しいですよね、データベースのデータ。欲しいですね。引数からのデータ

では手始めに、routes/web.phpに

    Route::get('/articles/{id}', 'ArticleController@show')->name('article.show');

と記載しましょう。これでarticles/{id}とする事でIDを受け取れます。
そして、app/Http/Controller/ArticleContolloerに

         public function show()
     {
         $message = 'Welcome to my BBS';
         $articles = Article::all();‘<--小　　大
         return view('index', ['message' => $message, 'articles' => $articles]);
     }

と記載し、//bbs/resources/viewsより、

     <!DOCTYPE html>
     <html>
         <head>
             <meta charset='utf-8'>
             <title>paiza bbs</title>
             <style>body {padding: 10px;}</style>
         </head>
         <body>
             <h1>paiza bbs</h1>
             <p>{{ $message }}</p>
             @foreach ($articles as $article)
                 <p>{{ $article->content }}</p>
             @endforeach
         </body>
     </html>
これでOKです。ではlocalhost:xxxxx:/article/1と。。


    Failed to connect server. Error: connect ECONNREFUSED 
    
あれー?おかしいね(秀)？

あっ・・・そっかぁ...起動コマンドを忘れてました

    php artisan serve 

はい。これで無事にデータが取り出せます



捕捉

route/web.phpに

        Route::get('/', function () {
            return return('welcome');
        });

がありましたね？ここのViewはMVCモデルのviewを返すことになってます。ではviewではなくredirectにするとどうでしょうか？

        Route::get('/', function () {
            return redirect('welcome');
        });
        
すると/indexに偏移します。直接的で便利ですね。
- ビューを直接返す (view('welcome')) → その場で welcome.blade.php を表示
- リダイレクトする (redirect('welcome')) → /welcome に移動して別ルートとして処理

※laravel　８以降のルーティングの書き方が変わります
    
    Route::get('/articles', 'ArticleController@index')->name('article.list');
が
    
    Route::get('/articles', [ArticleController::class, 'index'])->name('article.list');