この間、マクロスΔというアニメに出てくる音楽ユニット「ワルキューレ」のライブに当選して両日参戦してきました。
現地参戦してみたいとずっと思っていたので嬉しかったです。楽しい二日間でした。
メインで歌を歌っているJUNNAちゃんという子がいるのですが、ステージ上では世界一迫力があって格好いいのにもかかわらず、一曲目レコーディング時はなんと14歳であり、現在はまだ大学生なんです。
Twitterでは、「履修登録できたー!」と言っていたりして脳が混乱します。活動しつつ学校も行って本当にすごいなと思いました。
Laravelクエリビルダ
話は変わりまして、実装されませんでしたが紆余曲折したLaravelのクエリビルダを残しておこうと思います。データベースへアクセスして該当したレコードを論理削除する文でした。
以下の文を全てクエリビルダにして、短くしようとしました。※名称は変更しています
$tl = Line::where('id', '=', $id)->firstOrFail();
$List = Line::where('x_id', '=', $id)->get();
if ($tl->u_id == th::user()->id && $tl->b_id == th::user()->b_id && $tl->s_id == th::user()->s_id) {
$tl->delete();
foreach ($List as $cl) {
$cl->delete();
}
}
まず、関数を短くするためにif文を消して、SQLで削除まで行うような文にしました。
Line::where(function ($query) {
Line::where('s_id', th::user()->s_id)->where('b_id', th::user()->b_id)
->where('id', $id)->Where('u_id', th::user()->id)->delete();
Line::where('s_id', th::user()->s_id)->where('b_id', th::user()->b_id)->where('x_id', '=', $id)->delete();
});
次に、中の2文を一行にまとめます。
Line::where(function($query){
$query->where('s_id', th::user()->s_id)->where('b_id', th::user()->b_id);
})->where(function($query) use ($id){
$query->Where('id', $id)->Where('u_id', th::user()->id)->orWhere('x_id', $id);
});
上記の実際に実行されるSQL文です。
select
*
from
lines
where
(s_id = 0 and b_id = 1)
and
(id = 1208
and u_id = 33 or x_id = 1208)
and lines.deleted_at is null
無理にまとめて可読性が低くなってしまったため2行に戻しました。
データベースの整合性を保つためには2行にするとトランザクションが必要になるということで以下のようになりました。
DB::transaction(function () use ($id) {
$tl = Line::where('b_id', th::user()->b_id)->where('s_id', th::user()->s_id)
->where('id', $id)->Where('u_id', th::user()->id)->delete();
if ($tl > 0) {
Line::where('x_id', $id)->delete();
}
});
クエリビルダはSQL文とはまた違うということで難解でしたが勉強になったと思います。andとorはややこしいですね。