【laravel】HasManyThrough() を使うときに規定通りに書いているにも関わらず結果が0件で困った
Eloquent:リレーション 5.4 Laravel 5.4公式サイトの表記
リレーションのクエリ実行時は、典型的なEloquentの外部キー規約が使用されます。リレーションのキーをカスタマイズしたい場合は、hasManyThroughメソッドの第3引数と、第4引数を指定してください。第3引数は仲介モデルの外部キー名、第4引数は最終的なモデルの外部キー名です。そして第5引数はローカルキーです。
Eloquent:リレーション 5.5 Laravel 5.5公式サイトの表記
リレーションのクエリ実行時は、典型的なEloquentの外部キー規約が使用されます。リレーションのキーをカスタマイズしたい場合は、hasManyThroughメソッドの第3引数と、第4引数を指定してください。第3引数は仲介モデルの外部キー名、第4引数は最終的なモデルの外部キー名です。第5引数はローカルキーで、第6引数は仲介モデルのローカルキーです。
しかしながら、この通りに実装しても全然値が取れない。
実はこれ、第6引数までとるみたい...
<?php class First extends Model { public function Third() { return $this->hasManyThrough( 'App\Third', 'App\Second', 'C_id', 'A_id', null, 'B_id' ); } }
上記のような「FirstクラスからSecondクラスを経由してThirdクラスのデータを取得したい」場合、
hasManyThroughメソッドに渡す引数は順に、
- 最終的にデータを取得するクラス(Third)...'App\Third'
- 経由するクラス(Second)...'App\Second'
- 経由するクラス(Second)と呼び出し元(First)を繋ぐキー...'C_id'
- 呼び出し元(First)のマスターキー...'A_id'
よくわからないやつ👹呼び出し元(First)のローカルキー...null- 経由するクラス(Second)と最終的にデータを取得するクラス(Third)を繋ぐキー...'B_id' となる。
5番目の「よく分からないやつ」「呼び出し元(First)のローカルキー」にはnull
を渡すとうまくいった...これはいったいなんなのか???
これ、指定しなくてもいいんだねぇ......謎
😱💬 最初はこういう書き方してたせいで結果が0件だった.
そりゃ経由するクラス(Second)と最終的にデータを取得するクラス(Third)を繋ぐキーがなければ結果が出るはずもないよね. 反省.
<?php class First extends Model { public function Third() { return $this->hasManyThrough( 'App\Third', 'App\Second', 'C_id', 'A_id', 'B_id' ); } }
😭💬 教訓:ちゃんとバージョンにあったドキュメント読みましょうね.
【AWS】Laravelアプリケーションのデプロイ
Composer で作成されたファイルを含むソースバンドルを作成する
- アプリケーションのルートで実行する
- hoge.zip には付けたいファイル名を入れる
zip ../hoge.zip -r * .[^.]* -x "vendor/*"
ソースバンドルをデプロイする
- Elastic Beanstalk コンソールの管理ページへ移動する
- アップロードとデプロイで先程のファイルを選択し、デプロイボタンを押下する 🦑 < 結構時間かかるよ
確認
- ダッシュボードに遷移するので、完了になるまで待つ
ルートの設定
アプリケーションのURL叩くとエラーになってしまう。その原因は、ルートが / になっているから。
なので、ルートを /public にする必要がある。
- Elastic Beanstalk コンソールの管理ページへ移動する
- サイドメニューの [設定] へ移動する
- [設定] の [ソフトウエア] から [変更] でページ移動する
[ドキュメントのルート] に [/public] と入力し [変更] で完了
ダッシュボードに遷移するので、完了になるまで待つ
🦑 < 結構時間かかるよ
PHPでCSVのデータを加工するときに使った関数の備忘録
改行とカンマで区切られたCSV文字列を想定し実施
目的:与えられたCSV形式のデータから、頭2つのデータを配列として取り出す
- こんな感じのフォームを準備
<form action="{{ action('よしなに') }}" method="よしなに"> {{ csrf_field() }} <textarea name="csv" cols="30" rows="10" placeholder="CSV情報を入れてください"></textarea> <input type="submit" value="SEND"> <pre> 例: title-1, author-1, description-1 title-2, author-2, description-2 title-3, author-3, description-3 </pre> </form>
- このフォームに例をそのままぶち込んで送信したものを加工する。
<?php $csv = $request["csv"]; //改行ごとの配列 $item_groups = preg_split("/\n|\r\n|\r/", $csv); //タイトルと著者の配列 $items = []; $keys = ['title', 'author']; foreach ($item_groups as $item_group) { $c = preg_split("/,/", $item_group); //カンマごとに配列に格納 $chunk = array_chunk($c, 2)[0]; //前から2項目のみを配列に追加 $changeKey = array_combine($keys, $chunk); //keyを変更 array_push($items, $changeKey); }
説明
preg_split
を使って、改行ごとに配列にする.
正規表現は\n|\r\n|\r
で、改行コードを網羅.array_chunk
を使って、目的のindexまでを取得し配列にする.
これはindex[0][1]を取り出していると言うより、2個ずつ配列を分割している.
今回はindex[0][1]が欲しかったので、2個ずつ取り出した初めの配列を使った.array_combine
を使って、配列キーを変更する.array_push
を使って、結果配列に追加していく.
-array_push
🙂💬
特筆することはないけど、よく使う配列操作の関数は覚えておきたいなと思う.
あと、配列そのものに影響するのか、返り値が目的のものなのかというところも気をつけたい.