Laravelで掲示板作成の備忘録
モデルの取得
Eloquentモデル
データベーステーブルに情報を保存し、取得するために使用するモデルクラス
モデルと対応するデータベーステーブルを作成したら、データベースからデータを取得できるようになる。各Eloquentモデルは、対応するテーブルのデータベースへすらすらとクエリできるようにしてくれるクエリビルダだと考えると良い。
Eloquentのallメソッドはモデルテーブルの全レコードを結果として返す
$post = Post::all( );
Eloquentモデルでよく使うプロパティ
$connection
どのDB接続するのか。onメソッドで動的に変更可
$table
どのtableに対して処理するのか
$primaryKey
主キーの設定 id
$incrementing
主キーをオートインクリメントするかどうか
$timestamps
テーブルの作成、更新日時を自動更新
$fillable
渡した属性を複数代入させるかどうか(columnに値を入れたい場合必須)
$guarded
複数代入させないcolumnの指定($fillableと対)
$hidden
モデルを配列/JSON変換するときに隠蔽されるcolumnの指定
$visible
$hiddenと対
Eloquentモデルでよく使うメソッド
find
主キーを指定して検索
where
検索条件を指定 orWhere や引数でAND, OR検索ができる
count
件数を取得する
first
データを1件だけ取得する
toArray
データを配列に変換
toJson
データをJSONに変換
create, save
データの作成。createの場合は、モデルのfillableの設定が必須
insert
複数のデータを一括作成
update, save
データの更新
delete, destroy
データの削除。destroyは主キーを複数指定して削除可能
リレーション
関係 | 親 | 子 |
---|---|---|
1:1 | hasOne | belongsTo |
1:N | hasMany | belongsTo |
N:N | belongsToMany | belongsToMany |
デバッグログの使い方
出力したいカラムを持ってくる
$post = Post::find($post_id);
$posts = Post::all( );
出力する
Log::debug($post_id);
クエリーのログ
現在のリクエスト中に実行された全クエリーをメモリーにログしておくことが可能
クエリー(query)
クエリー【query】 データベース管理システム(DBMS)の操作に使われる命令。 さまざまな処理要求を照会言語という特定の文字列の組み合わせで表現し、データの検索・抽出・比較・並べ替えなどを行う。 クエリーを記述する代表的な照会言語としてSQLが広く使われる。
参照:コトバンク https://kotobank.jp/word/%E3%82%AF%E3%82%A8%E3%83%AA%E3%83%BC-2888
ログを有効にする
DB::connection()->enableQueryLog();
実行済みのクエリーの配列を取得する
$queries = DB::getQueryLog();
出力
Log::debug($query);
[2017-09-07 11:28:39] local.DEBUG: array (
0 =>
array (
'query' => 'select * from `posts` where `posts`.`id` = ? limit 1',
'bindings' =>
array (
0 => '3',
),
'time' => 2.75,
),
)
投稿フォームを作る際にFormクラスが見つからない
class 'Form' not found laravel
解決策
1.インストールコマンドでvendorに追加
composer require laravelcollective/html
composer.json に laravelcollective/html が追加され、インストールもされた
2.ProviderとAliaseを登録
config/app.php
'providers' => [
...
Collective\Html\HtmlServiceProvider::class,
...
'aliases' => [
...
'Form' => Collective\Html\FormFacade::class,
'Html' => Collective\Html\HtmlFacade::class
...
validationクラスが見つからない
Class 'App\Http\Controllers\Validator' not found
解決策
validatorを使っている◯◯controller.phpに以下を追記
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Facades\Input;
use Illuminate\Support\Facades\Redirect;
フォームリクエストとは
・フォームを含む各リクエストに対して、それぞれ固有のバリデーションを設定できる。
・バリデーションエラー時には、入力値とエラー情報を付与して前のページに自動的にリダイレクトする。
・バリデーションをパスした時に初めてコントローラー内の処理に移る。
validatorの使い方
・Validatorインスタンスが生成されたら、fails(もしくはpasses)メソッドを使用しバリデーションを実行
・バリデーションエラーが起きた場合、エラーメッセージと入力値がフラッシュデータとして保存され、入力を行ったページにリダイレクトするようなレスポンスが生成される。
//Validatorインスタンスが生成された場合
if ($validator->passes()) {
$post = new Post;
$post->title = Input::get('title');
$post->content = Input::get('content');
$post->name = Input::get('name');
$post->save();
return Redirect::back()
->with('message', '投稿が完了しました。');
//エラーの場合
}else{
return Redirect::back()
//エラーを表示
->withErrors($validator)
->withInput();
}
HTMLの要素にIDをつける
id属性で、要素に対してID(固有の識別名)を付けることができる
このIDは、スタイルシートのセレクタ(スタイルの適用対象)として使用されるほか、スクリプトやリンクなどの参照先として使用される
メリット
要素にidを割り振ることでjavascript, juery内で変数の受け渡しなどができるようになる
方法
idを割り振る
formタグにid 'content'を指定
<div class="form-group">
<label for="aaa" class="">内容</label>
<div class="">
{{ Form::textarea('content', null, array('id' => 'content')) }}
</div>
</div>
他の箇所で使用する
<script>
$(function (){
$("#modal_confirm").on("click", function(){
var content_value = $("#content").val();
$("#modal_content").html(content_value);
});
});
</script>
親のタイムスタンプの更新
あるモデルが他のモデルに所属(belongsToもしくはbelongsToMany)しており、子のモデルが更新される時に親のタイムスタンプを更新できる