Laravelクイズ機能:アプローチ②
ダブり問題の解決法は聞いてみたけど時間かかりそうだしもうやり方変えよう。
①ダブるけど上手くいってたコード
・TestController.php
public function test(Request $request, $id) {
$user = User::find($id);
$scope = $request->input('scope');
$style = $request->input('style');
$order = $request->input('order');//引き継がれた順序を$orderと呼ぶ
if ($scope == 'my_cards') {
$cards = $user->cards();
} else {
$cards = $user->good_cards();
}
/*$orderの中身があれば(2ページ目以降なら)$orderが並び順。
そうでなければランダムが並び順。*/
if ($order == null) {
$count = $cards->count();
$numbers = range(1, $count);
shuffle($numbers);
$pages = null;
foreach ($numbers as $number) {
// for ($i=1; $i <= $count; $i++){
// $pages .= $i;
$pages .= $number;
};
} else {
$pages = $order;
};
$cards = $cards->groupBy('cards.id')->inRandomOrder($pages)->paginate(1);
return view('test.test', [
'cards' => $cards,
'order' => $pages,
'scope' => $scope,
'style' => $style,
]);
}
・test.blade.php
@extends('commons.app')@extends('commons.app')
@section('content')<div class="container"> <p class="text-right mb-3">{!! link_to_route('users.test_index', 'テストを終了', ['id' => Auth::id()]) !!}</p> @if (count($cards) == 0) <h5 class="text-center">カードがありません。</p> @elseif ($style == 'english_question') <ul class="list-unstyled"> @foreach ($cards as $card) <li> <div class="row"> <div class="col-6"> <div class="card"> <div class="card-body"> <p class="card-title">English 英語:</p> <p>{{ $order }}</p> <p class="card-text">{{ $card->english }}</p> </div> </div> </div> <div class="col-6"> <div class="card"> <div class="card-body"> <p class="card-title">Japanese 日本語:</p> <textarea rows="4" class="form-control"></textarea> </div> </div> <div class="hidden_box"> <label for="answer" class="btn btn-dark btn-block">答えを見る</label> <input type="checkbox" id="answer"> <div class="hidden_show"> <!--非表示ここから--> <div class="card"> <div class="card-body"> <p class="card-title">Answer 答え:</p> <p class="card-text">{{ $card->japanese }}</p> </div> </div> <!--ここまで--> </div> </div> </div> </div> </li> @endforeach </ul> @else <ul class="list-unstyled"> @foreach ($cards as $card) <li> <div class="row"> <div class="col-6"> <div class="card"> <div class="card-body"> <p class="card-title">Japanese 日本語:</p> <p class="card-text">{{ $card->japanese }}</p> </div> </div> </div> <div class="col-6"> <div class="card"> <div class="card-body"> <p class="card-title">English 英語:</p> <textarea rows="4" class="form-control"></textarea> </div> </div> <div class="hidden_box"> <label for="answer" class="btn btn-dark btn-block">答えを見る</label> <input type="checkbox" id="answer"> <div class="hidden_show"> <!--非表示ここから--> <div class="card"> <div class="card-body"> <p class="card-title">Answer 答え:</p> <p class="card-text">{{ $card->english }}</p> </div> </div> <!--ここまで--> </div> </div> </div> </div> </li> @endforeach </ul> @endif {{ $cards->appends(['scope' => $scope, 'style' => $style, 'order' => $order])->render('pagination::bootstrap-4') }}</div>@endsection
②config/database.phpのstrictを'true'に戻す。
③案:
1コントローラでカードのidを全て取得。
2idの配列の中から乱数一つを生成。
3カードをid検索して渡す。※直前で使ったidが出た場合は違うのが出るまでやり直し。
→失敗の連続で今日は諦め。
④今日学んだこと
rand ( int $min , int $max )
array_rand (array, 取り出したい数 );
array_column($cards, 'id')ある配列の中から取り出したいカラムのみ配列で取り出せる(?)