Laravel学習用備忘録

この記事の主目的は、自分（筆者）のための備忘録である。
筆者は初心者であるため、本記事は正確ではないことをご了承いただきたい。

なお、参考にしたのは、
1. https://awesome-linus.com/2019/06/05/laravel-tutorial-basic-from-zero
2. https://www.hypertextcandy.com/laravel-tutorial-introduction
3. https://www.techpit.jp/courses/enrolled/777553
の3つの記事である。
不具合が生じるときは、上記の記事を参考にすること。

## プロジェクト作成、sqliteの設定まで。

データベースはファイル一つで管理可能なsqliteを使用することにする。
前提：windowsにphp, composer, sqlite3がインストールされている。


1. プロジェクト作成
 1. VS Codeのパワーシェルを起動
 2. cdコマンドでプロジェクトを作りたいところまで移動（laravel学習用フォルダあり）
 3. `composer create-project laravel/laravel=[version数を指定（LTSの6が良いか）] [プロジェクト名]`
 4. `cd [プロジェクト名]`
 5. `php artisan serve`のあとに、http:127.0.0.1:8000にアクセスでロケットが出ればOK。

2. sqliteの設定
    1. `ni database/database.sqlite`　注）niは新しいファイルを作成するコマンド。touchはパワーシェルで使用できない。
    2. .envファイルを次のように変更。
 
```php:.envDB
DB_CONNECTION=sqlite
# DB_HOST=127.0.0.1
# DB_PORT=3306
# DB_DATABASE=homestead
# DB_USERNAME=homestead
# DB_PASSWORD=secret
```
 
これでとりあえず、始められるようになった。

## その他の備忘録

### コントローラーの作成
 - `php artisan make:controller [コントローラ名]`ですよ！
 - 　命名規則は単数でも、複数でも良いみたい。ただし名前の最後はControllerとすることは忘れないように。
 - 　`php artisan make:controller ArticleController --resource`とすると、CRUDがすぐに作れるようなファンクション名をつけてコントローラを作ってくれる。
 - 　ルーティングに`Route::resourece('articles', 'ArticleController')`とすると、--resourceオプションを付けて作ったコントローラのfunctionと一致するので便利。

### マイグレーションファイルの作成からテーブルの作成（マイグレート）まで
 - 下記コマンドを実施。ただし、「pets」のところは任意のテーブル名にすること。
 - `php artisan make:migration create_pets_table --create=pets`
 - /database/migrations/内に今作ったcreate_pets_tableあり。その中を編集して、テーブルを定義する。
 - `php artisan migrate`でマイグレートを実行。テーブルができた。
 - ※なおマイグレーション実行後に、前の状態に戻したいときは、`php artisan migrate:rollback`を実施。改めてマイグレーションファイルを直して、マイグレートする。

#### 外部キーを参照するカラムの作成時
- articlesテーブルにusersテーブルのidを参照する、user_idというカラムを作る。
    - articlesマイグレーションファイル内に、`$table->foreign('user_id')->references('id')->on('users');`を記述する
    - このとき、外部キーにusersテーブルの主キーidと関連付けて、user_idとすると、このあとの処理が楽になる。
    - Articleモデルにリレーションを記述する（参考3を参照する）。

### モデルの作成
-　モデルを作成するというのは、ORM対応することみたいなイメージなのかな。
-　上で作ったpetsテーブルに対応する、Pet モデルクラスを作成することで、勝手にLaravelさんが認識してくれるらしい。`php artisan make:model Pet`ポイントは、テーブル名は複数形、modelクラスは単数形ということ。
-　~~モデルの作成に失敗したとき：よくわからんが、テーブルを消す、マイグレーションファイルを消す→`composer dump-autoload`を実行（名前空間の再読込らしい）→再度マイグレーションファイルの作成→モデル定義→マイグレートを実施する。~~
-　データベースをやり直したい場合は、resetなどを駆使するみたい。今度調べよう。

#### 入力値のガード
　モデルを作成したら、以下のように記述して、入力値以外を入れられないようにする。

```php:Article.php
class Article extends Model
{
    protected $fillable = [
        'title', 'text'
    ];
}
```

#### リレーションの追加
ユーザーテーブルと記事テーブルが1対多の関係にある場合、Articleモデルに以下のように記述してリレーションする。

```php:Article.php
class Article extends Model
{

中略

    public function user()
    {
        return $this->belongsTo('App\User');
    }
}

```

逆にUserモデルに以下のように記述する。

```php:User.php
class User extends Authenticatable
{
中略

public function articles()
    {
        return $this->hasMany('App\Article');
    }
```

使い方は、
`$article->user;`でユーザーインスタンス、
`$article->user->name;`でユーザーのnameプロパティが返る。
`$user->articles;`でarticlesプロパティが得られ、Laravelの仕組みで自動的にコレクションが返るようになる。foreach等で使える。
`$user->articles()->where('title', 'foo')->first()`のように、articlesメソッドにして、チェーンでクエリビルダをつなげて、データを取得できる。


### sqliteの操作
- `sqlite3 [sqlファイルのパス名]`で選択したsqlファイルを操作できるようになる
- プロンプトに>sqliteと出たら、sqliteコマンドを打てる状態
    - `.table`でテーブル一覧を取得
    - `.schema [テーブル名]`でテーブル定義を確認
    - `select * from [テーブル名];`（セミコロン忘れないで！）
- この記事を参照すると良さそう → [SqliteでDBの中身を確認](https://qiita.com/baraobara/items/027a4bcbad1c4c68798d)

### テーブルにテストデータを挿入する
- シーダーを使ってみる
    - `php artisan make:seeder FoldersTableSeeder`　「Folders」の部分は適宜自分のテーブル名（複数形）にする
    - 詳細は[この記事](https://www.hypertextcandy.com/laravel-tutorial-todo-app-list-folders/)を参照。
- その他にコントローラーにデータを配列で記載するのもあり。その際は配列の前に(object)をつけること。Laravelで受け取るのは配列型ではなく、オブジェクト型だからだそうだ。`$sample_datas = [(object)[連想配列], (object)[連想配列],];`

### アクセサの使い方
- モデルクラスの作成時はプロパティにカラムデータを持っていない。
- モデルクラス内の$attributesというプロパティで配列で管理されている。
- アクセサとは、get〇〇Atributeというメソッドを定義することで、あたかもデータをモデルクラスのプロパティとして値を取得できるようになる。
- 例えば、Personテーブルにfavoriteカラムが定義されているとする。favoriteカラムのデータを取得したいときは以下のようにする。Personモデルクラス内で`public function getFavoriteTextAttribute(){処理};`を記述して、コントローラーやテンプレートで使うときに`$person->favorite_text;`とする。注意として、定義時はキャメルケース、使用時はスネークケースとすること。

### コレクション
- コントローラ等で`モデル名::all()`とすると、コレクションを返す。
- コレクションとは、配列を拡張したもので、Laravelに用意されたクラスのこと。
- 配列と同様に扱え、さらに配列にはない様々なメソッドを使うことができる。
- sortByDesc()などもコレクションで使えるメソッドの一つ。

### @エクステンド、イールドの使い方
- ベースファイルを作る。埋め込む予定のところに`@yield('[section名]')`を記しておく。
- 各viewファイルにベースを呼び出すために、`@extends('[ベースviewファイル名]')`を記す。
    - 埋め込みたい部分を`@section('[section名]')～@endsection`で記す。
- `@include[view名]`で他のviewを読み込みできる。

### 改行込みの文章をbladeでそのまま表示する方法
ブレードファイル内で`$hoge`が改行を含む文章としたら、`{!! nl2br(e( $hoge )) !!}`とすることで、改行を含むそのまま表示できる。

### Tinker
- `php artisan tinker`をすると、Laravelのシェルが開かれる。そこでは、laravelメソッドがつかえるとのこと。

### ユーザー認証
- Laravelに標準でついているものを最初は使っていく。参考３をみること。
- `php artisan route:list`ですでにルーティングされているものが確認できる。ユーザー認証に関するルーティングもこれで確認できる。