この記事の主目的は、自分(筆者)のための備忘録である。
筆者は初心者であるため、本記事は正確ではないことをご了承いただきたい。
なお、参考にしたのは、
- https://awesome-linus.com/2019/06/05/laravel-tutorial-basic-from-zero
- https://www.hypertextcandy.com/laravel-tutorial-introduction
-
https://www.techpit.jp/courses/enrolled/777553
の3つの記事である。
不具合が生じるときは、上記の記事を参考にすること。
プロジェクト作成、sqliteの設定まで。
データベースはファイル一つで管理可能なsqliteを使用することにする。
前提:windowsにphp, composer, sqlite3がインストールされている。
-
プロジェクト作成
-
VS Codeのパワーシェルを起動
-
cdコマンドでプロジェクトを作りたいところまで移動(laravel学習用フォルダあり)
-
composer create-project laravel/laravel=[version数を指定(LTSの6が良いか)] [プロジェクト名]
-
cd [プロジェクト名]
-
php artisan serve
のあとに、http:127.0.0.1:8000にアクセスでロケットが出ればOK。 -
sqliteの設定
-
ni database/database.sqlite
注)niは新しいファイルを作成するコマンド。touchはパワーシェルで使用できない。 - .envファイルを次のように変更。
-
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を参照する)。
- articlesマイグレーションファイル内に、
モデルの作成
- モデルを作成するというのは、ORM対応することみたいなイメージなのかな。
- 上で作ったpetsテーブルに対応する、Pet モデルクラスを作成することで、勝手にLaravelさんが認識してくれるらしい。php artisan make:model Pet
ポイントは、テーブル名は複数形、modelクラスは単数形ということ。
- モデルの作成に失敗したとき:よくわからんが、テーブルを消す、マイグレーションファイルを消す→composer dump-autoload
を実行(名前空間の再読込らしい)→再度マイグレーションファイルの作成→モデル定義→マイグレートを実施する。
- データベースをやり直したい場合は、resetなどを駆使するみたい。今度調べよう。
入力値のガード
モデルを作成したら、以下のように記述して、入力値以外を入れられないようにする。
class Article extends Model
{
protected $fillable = [
'title', 'text'
];
}
リレーションの追加
ユーザーテーブルと記事テーブルが1対多の関係にある場合、Articleモデルに以下のように記述してリレーションする。
class Article extends Model
{
中略
public function user()
{
return $this->belongsTo('App\User');
}
}
逆にUserモデルに以下のように記述する。
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の中身を確認
テーブルにテストデータを挿入する
- シーダーを使ってみる
-
php artisan make:seeder FoldersTableSeeder
「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に標準でついているものを最初は使っていく。参考3をみること。
-
php artisan route:list
ですでにルーティングされているものが確認できる。ユーザー認証に関するルーティングもこれで確認できる。