Laravel メモ

# Laravelで掲示板作成の備忘録  

<br />

## モデルの取得

Eloquentモデル
> データベーステーブルに情報を保存し、取得するために使用するモデルクラス

<br/>

モデルと対応するデータベーステーブルを作成したら、データベースからデータを取得できるようになる。各Eloquentモデルは、対応するテーブルのデータベースへすらすらとクエリできるようにしてくれるクエリビルダだと考えると良い。

<br/>

Eloquentのallメソッドはモデルテーブルの全レコードを結果として返す

```
$post = Post::all( );
```

<br/>

## Eloquentモデルでよく使うプロパティ

#### $connection
> どのDB接続するのか。onメソッドで動的に変更可

#### $table
> どのtableに対して処理するのか

#### $primaryKey
> 主キーの設定	id

#### $incrementing
> 主キーをオートインクリメントするかどうか

#### $timestamps
> テーブルの作成、更新日時を自動更新

#### $fillable
> 渡した属性を複数代入させるかどうか(columnに値を入れたい場合必須)

#### $guarded
> 複数代入させないcolumnの指定($fillableと対)

#### $hidden
> モデルを配列/JSON変換するときに隠蔽されるcolumnの指定

#### $visible
> $hiddenと対

<br/>

## Eloquentモデルでよく使うメソッド

#### find
 > 主キーを指定して検索

#### where
> 検索条件を指定 orWhere や引数でAND, OR検索ができる

#### count
> 件数を取得する

#### first
> データを1件だけ取得する

#### toArray
> データを配列に変換

#### toJson
> データをJSONに変換

#### create, save
> データの作成。createの場合は、モデルのfillableの設定が必須

#### insert
> 複数のデータを一括作成

#### update, save
> データの更新

#### delete, destroy
> データの削除。destroyは主キーを複数指定して削除可能

<br/>

## リレーション

|関係|親|子|
|:--:|:--:|:--:|
|1:1|hasOne|belongsTo|
|1:N|hasMany|belongsTo|
|N:N|belongsToMany|belongsToMany|


<br/>
<br/>


## デバッグログの使い方
出力したいカラムを持ってくる

```
$post = Post::find($post_id);
$posts = Post::all( );
```

出力する

```
Log::debug($post_id);
```
<br/>
<br/>

## クエリーのログ
現在のリクエスト中に実行された全クエリーをメモリーにログしておくことが可能

クエリー(query)
> クエリー【query】 データベース管理システム（DBMS）の操作に使われる命令。 さまざまな処理要求を照会言語という特定の文字列の組み合わせで表現し、データの検索・抽出・比較・並べ替えなどを行う。 クエリーを記述する代表的な照会言語としてSQLが広く使われる。
参照：コトバンク https://kotobank.jp/word/%E3%82%AF%E3%82%A8%E3%83%AA%E3%83%BC-2888

<br/>


#### ログを有効にする
```
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,
  ),
)
```
<br/>
<br/>


## 投稿フォームを作る際にFormクラスが見つからない

```
class 'Form' not found laravel
```

#### 解決策
### 1.インストールコマンドでvendorに追加

```
composer require laravelcollective/html
```

composer.json に laravelcollective/html が追加され、インストールもされた
<br />

### 2.ProviderとAliaseを登録

config/app.php

```
    'providers' => [
...
        Collective\Html\HtmlServiceProvider::class,
...

    'aliases' => [
...
        'Form' => Collective\Html\FormFacade::class,
        'Html' => Collective\Html\HtmlFacade::class
...
```

<br/>
<br/>

## 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;
```

<br/>

### フォームリクエストとは
・フォームを含む各リクエストに対して、それぞれ固有のバリデーションを設定できる。  

・バリデーションエラー時には、入力値とエラー情報を付与して前のページに自動的にリダイレクトする。  

・バリデーションをパスした時に初めてコントローラー内の処理に移る。  

<br/>

### validatorの使い方
・Validatorインスタンスが生成されたら、fails（もしくはpasses）メソッドを使用しバリデーションを実行

・バリデーションエラーが起きた場合、エラーメッセージと入力値がフラッシュデータとして保存され、入力を行ったページにリダイレクトするようなレスポンスが生成される。

<br/>

```
//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();
        }
```

<br/>
<br/>


## 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>
```

<br/>
<br/>

## 親のタイムスタンプの更新
あるモデルが他のモデルに所属（belongsToもしくはbelongsToMany）しており、子のモデルが更新される時に親のタイムスタンプを更新できる

https://readouble.com/laravel/5.1/ja/eloquent-relationships.html