心にうつりゆくよしなしごとをそこはかとなく書きつくって自分を集めた事典
laravel小技集〜失敗と教訓、罪と罰〜

laravel小技集〜失敗と教訓、罪と罰〜

マイグレーションを実行したい
joinしたいがカラム名が重複!
?hoge=value/&hoge=value
よし、慎吾リックリンクだ!
gitでclone
呼び先のmethodでreturn呼び元のmethodでもreturn。
9>10
@extendsを条件に応じて変えたい
気軽にphpinfo();が見たい
〜失敗編〜

マイグレーションを実行したい

$ php artisan migrate

クエリビルダでDB読み込み、joinしたいがカラム名が重複してしまった!

〜大事なこと〜

->select(‘table_name.column_name as hoge’)みたいな感じ
重複を解決したら、状況によってはtable_name.*とかも使えて楽。以前は*無しで必要なカラムにいちいち命名していたけれど、よく考えたら*がめちゃくちゃ便利だわ。

〜やりたかったこと〜

データベースから、aso_reposというテーブルとusersというテーブルについて取得したい。aso_reposにもusersにもidがあって、aso_repos.user_idとusers.idを紐づけたい。
しかしカラム名が重複(idとかnameとか)していたので、解決策を模索。

〜やったこと〜

->select(‘table_name.column_name as hoge’)みたいな感じでカラム名を新たに決めてやればいいらしい。usersテーブルから取得したいのは、id, name, login_idの3種類。aso_reposテーブルからは全てを取得したい。aso_reposテーブルのカラム も1つ1つ名前を付けないとダメなのか?と思ったけれど、usersテーブルの方でカラム名を命名していて、今となっては重複がないので、’aso_repo.*’とだけ指定すればいいみたい。
*に関しては、「こんな楽な方法があったなら知りたかった」というのが率直な感想。以前はすべてのカラム名を指定していて、めちゃ長くなっていた……。

?hoge=valueとするか、&hoge=valueとするか。

〜やりたかったこと〜

現状、クエリ文字列があるかもしれない。無いかもしれない。わからないけれどクエリ文字列を追加したい。

〜やったこと〜

‘?’がすでに存在するかで分岐してみました。
blade上で、strposして’?’がすでに存在するか判定。存在していれば末尾に?hoge=valueを付加、存在していなければ?hoge=valueを不可、という分岐にしました。
クエリ文字列を含んだURLは、{{url()->full()}}で取得。

ドキュメントルートを変えたいが、サーバーの設定は変えられない。よし、慎吾リックリンクだ!

〜大事なこと〜

laravelのドキュメントルートは(project)/public/
publicを丸ごとシンボリックリンクにしてドキュメントルートを模擬?した。
$ ln -s 元 先

〜やったこと〜

$ ln -s /path/to/project/public /var/hoge
みたいな
$ cd /var/hogeすると、/path/to/project/publicの中身が表示される。
※リンク元で「~/」はやっていいけれど、「./」はやっちゃダメらしい。中身が出なかったり、「No such file or directory」と怒られたりした。
削除の場合はrm hoge

gitでcloneする場合、vendorと.envは初期設定でgitignoreされている。

〜やりたかったこと〜

ローカルで開発したプロジェクトを、サーバーにgitでアップロード。

〜やったこと〜

模範解答は「コマンドでプロジェクトを作りなさい、.envは環境に応じた設定を書きなさい」だろうけれど、scpでvenderと.envをまるっとコピーした。

呼び先のmethodでreturn呼び元のmethodでもreturn。

〜やりたかったこと〜

共通部分を共通化したかった。
ログインしていたらviewを呼ぶ、ログインしていなかったらログイン画面に飛ぶ、そういう処理を書きたかった。

〜やったこと〜

当初、呼び先のmethodでreturn view~としたけれど動かない。
呼び先ではreturn view~、呼び元ではreturn $this->hoge();としたら動いた。

9>10

〜大事なこと〜

「数字部分を抽出して配列に」->「最大の数字を取得」

〜やりたかったこと〜

「n_700.jpg」のようなファイル名がある。nは自然数。1番から番号を振っていきたい。後日ファイルが追加になったとき、続きの番号から{=(最大のn)+1から}ファイル名を振っていきたい。
1桁までは文字列の並べ替えでよかったが、9>10のような判定になってしまって困った。

〜やったこと〜

$file_names = scandir(public_path() . ‘/img/asobi/’ . $request->aid . ‘/aso_repo/’, 1);
$j = 0;
foreach($file_names as $file_name){
$file_names[$j++] = substr($file_name, 0, -8);
}
$i = max($file_names);

@extendsを条件に応じて変えたい

〜大事なこと〜

テンプレート側では@extends($hoge)のように記述して、コントローラ側で$hogeの内容を変える。

〜やりたかったこと〜

パソコンなら’objects.common’をextendsする、スマホなら’sp_objects.common’をextendsする、という分岐をやりたかった。

〜やったこと〜

@if(スマホ?)
@exends(‘sp_objects.common’)
@else……
のようにしたけれどダメ。

ミドルウェアで、スマホなら$request->ua=’sp_’、パソコンなら$request->ua=”となるようにして、
return view(hoge.hoge’, [‘ua’ => $request->ua . ‘objects.common’);とした。
そしてview側で@extends($ua)とすると、UAに応じたextendsができた。

気軽にphpinfo();が見たい

〜大事なこと〜

phpinfo();専用のmethodを定義。
(例)
public function phpinfo(){
phpinfo();
}
ルーティングして、特定のURLからphpinfo()が呼び出されるようにする。
Route::get(‘/phpinfo’, ‘HogeController@phpinfo’);
hoge.hoge.com/phpinfoにアクセスすると、phpinfoが出る。
※用が済んだら直ちに消しましょう!悪意のある人にも丸見えです。

〜失敗編〜

bladeテンプレートって便利だけど、{}とか()とかは Atomくんが対応する相方を教えてくれるから、それに甘えるようになっちゃった私としては@ifと@endifの対応を教えてくれないのがちょっと寂しい。(訳:@endifを書き忘れることがたまにある)

スクリーンショット 0030-09-05 16.39.03 
人間は、往々にして人様のせいにしてしまう。自分がディレクトリを間違えただけなのに、「このサーバーだとできないのか」なんて言うことがある。

スクリーンショット 0030-08-29 23.44.15

スクリーンショット 0030-08-27 13.11.20
惑わされちゃいけない。コントローラ内部に問題があってもこの文章が出る。

そう。こんな凡ミスでも。

 スクリーンショット 0030-08-27 13.12.10
共通部分を共通化したくて、ControllerからControllerを呼び出した。呼び出せたように見えたが、挙動がおかしい。具体的には、session保存できる、1回目はsessionを正しく読み込める、2回目以降はsessionがnull扱い、ただし呼び出し元と呼び出し先が同じControllerの場合(つまり$this->)は正常動作。
いまだに原因不明で気持ち悪いけれど、王道のMiddleware使用で解決。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です