1,前提・実現したいこと
検索ボックスに入力した文字を含む本のタイトルをbooksテーブルから探して、該当する本のタイトルと本の表紙の画像を表示する検索機能を作ることが前提。また、本のタイトルか画像をクリックすることでその本を評価するペ-ジに飛べるようになっています(booksテーブルのidで識別)。
2, 発生している問題・エラーメッセージ
表示することは出来たが、重複しているデータが全て表示されてしまうため、同じ本のタイトルと表紙が何回も表示されて困っています。
3, 該当のソースコード
BookController.php
//検索結果の表示 public function searchExecute(Request $request ) { $keyword = $request->input('booklist'); $request->validate(['booklist' => 'required'],['booklist.required'=>'入力が空白です']); //検索ボタンが押された時の処理 if(isset($request["booklist"])) { //入力チェック if(!empty("booklist")) { //本のidとタイトルと筆者名と画像をグループ化 $groupby = Book::select('id','title','author','largeImageUrl')->groupBy('title')->groupBy('author')->groupBy('id')->groupBy('largeImageUrl'); //タイトルをあいまい検索 $title = $groupby->where('title','like', '%' .$keyword. '%')->paginate(10)->appends($request->except(['user_id'])); return view('searchExecute')->with([ 'title' => $title ]); } } }
searchExecute.blade.php
@foreach($title as $book) <div class='booktitle'> @if($book->largeImageUrl == NULL)//表紙の画像がなければこっち //本のタイトルと画像を<a>タグで囲って、テーブルのidで識別 <a href="/books/{{$book->id}}"><img src="{{$book->largeImageUrl = 'https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/noimage_01.gif?_ex=200x20'}}" width="250" height="300"></a> <a href="/books/{{$book->id}}"><p>{{Str::limit($book->title,30)}}</p></a> @else //表紙の画像があればこっち //本のタイトルと画像を<a>タグで囲って、テーブルのidで識別 <a href="/books/{{$book->id}}"><img src="{{$book->largeImageUrl}}" width="250" height="300"></a> <a href="/books/{{$book->id}}"><p>{{Str::limit($book->title,30)}}</p></a> @endif </div> @endforeach
ScoreController.php
//クリックした本のタイトルのidを取得&ブックマークボタンの実装 public function search(Book $book,Bookmark $bookmark) { $id = $book->id; $bookmark=Bookmark::where('book_id',$id)->exists(); return view('score')->with(['book'=>$book, 'bookmark'=>$bookmark]); }
4, 自分で調べたことや試したこと
BookController.phpのselectをid無しで試してみたのですが、重複したデータが一回しか出てこなくなった代わりに、上述の[1,前提・実現したいこと]の太文字で書いてある部分の機能が出来なくなってしまった為、やめました。
5, 使っているツールのバージョンなど補足情報
バージョンはPHPのlaravel6です。
--追記--
booksテーブル
MariaDB [book]> desc books; +---------------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------------+------------------+------+-----+---------+----------------+ | id | int(10) unsigned | NO | PRI | NULL | auto_increment | | title | varchar(255) | NO | | NULL | | | link | varchar(255) | YES | | NULL | | | author | varchar(255) | NO | | NULL | | | category | varchar(255) | YES | | NULL | | | guid | text | YES | | NULL | | | isbn | varchar(255) | YES | | NULL | | | booksGenreId | varchar(255) | YES | | NULL | | | publisherName | varchar(255) | YES | | NULL | | | largeImageUrl | text | YES | | NULL | | | created_at | timestamp | YES | | NULL | | | updated_at | timestamp | YES | | NULL | | +---------------+------------------+------+-----+---------+----------------+ 12 rows in set (0.01 sec)
booksテーブルの中身は下記のようにしてAPIの情報を保存しています。
$bookbook = []; //二つのAPIの情報を整理 for($i=0;$i<count($books);$i++) { $books[$i] += ["isbn" => null]; $books[$i] += ["booksGenreId" => null]; $books[$i] += ["publisherName" => null]; $books[$i] += ["largeImageUrl" => null]; array_push($bookbook,$books[$i]); } for($i=0;$i<count($rakutenn_books);$i++) { $rakutenn_books[$i]['Item'] += ["guid" => null]; $rakutenn_books[$i]['Item'] += ["link" => null]; $rakutenn_books[$i]['Item'] += ["category" => null]; array_push($bookbook,$rakutenn_books[$i]['Item']); } //これが登録 foreach($bookbook as $item) { Book::create([ 'title'=>$item['title'], 'link'=>$item['link'], 'author'=>$item['author'], 'category'=>$item['category'], 'guid'=>$item['guid'], 'isbn'=>$item['isbn'], 'booksGenreId'=>$item['booksGenreId'], 'publisherName'=>$item['publisherName'], 'largeImageUrl'=>$item['largeImageUrl']]); }
DBにあるデータの説明はこれで大丈夫でしょうか?






回答2件
あなたの回答
tips
プレビュー