質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Q&A

解決済

1回答

410閲覧

Laravelでunionを使ってpaginationを返すapiの作り方

yoshi448

総合スコア17

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

0グッド

0クリップ

投稿2020/12/30 04:01

お世話になっております。
現在フロント側をvueでバック側をlaravelで開発しているのですが、そこでタイトルのapiの作り方が分からなくて困っています。
今使っているapiが下記のものでこれを改善してpaginationにしてリターンしたいのですがどうすれば良いのでしょうか?(最初のwhereのところと$tag->moviesのところにpaginate()を入れてみたのですが500エラーが返ってきてしまいます)

よろしくお願いいたします。

laravelphp

1 public function searchByTitle(Request $request){ 2 $movies = Movie::where('title','like',"%$request->title%")->orderBy('created_at','desc')->get(); 3 $tag = Tag::where('tag_name',$request->title)->first(); 4 if($tag){ 5 $tag_movie = $tag->movies; 6 $result = $tag_movie->union($movies); 7 }else{ 8 $result = $movies; 9 } 10 if($result->isEmpty()){ 11 return response()->json(['message'=>"empty"]); 12 }else{ 13 return response()->json(['message'=>'is exist','data'=>$result]); 14 } 15 }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

phper.k

2020/12/30 09:42

どこにunion使いたいんでしょうかね?
yoshi448

2020/12/30 10:54

わかり難くてすいません。 上記のコードの$moviesと$tagのbelongsToで取得したMovieのコレクション($tag_movie)をunionした$resultを返したいです。 ここまでは正常に動作してるのは確認しています。 そしてこの$resultをpaginate()の形で返したいです。
phper.k

2020/12/30 11:02

union って SQLのUNION句のことを言っているわけではないのですね?
yoshi448

2020/12/30 11:07 編集

そうですね。 sqlではなくlaravelが提供している同じ構造をしているコレクションを結合するのに使う方のunionです。
phper.k

2020/12/30 11:08

要件を推測する限り、union を使うというのは悪手ですが、union を使うというのは必須条件ですか?
yoshi448

2020/12/30 11:16

いえ、moviesとtag_movieを1つのデータにまとめてそれを表示し、表示するデータ数が大きい場合ページネーションを実装できれば良いので必須ではありません。 しかし自分でページネーションを実装したことがなく…他にどういった方法がいいのでしょうか?
guest

回答1

0

ベストアンサー

要件が明確ではないので、推測で書いておきました。
当然ですが、正しくリレーション設定がされていることを前提にしています。

php

1class MovieController extends Controller 2{ 3 /** 4 * @param Request $request 5 * @return \Illuminate\Http\JsonResponse 6 */ 7 public function index(Request $request) 8 { 9 $movies = Movie::query() 10 ->with(['tags']) 11 ->whereHas('tags', function (Builder $builder) use ($request) { 12 $builder->where('tag_name', '%' . $request->title . '%'); 13 }) 14 ->paginate(); 15 16 if ($movies->isEmpty()) { 17 return response()->json(['message'=>"empty"]); 18 } 19 20 return response()->json(['message' => 'is exist', 'data' => $movies]); 21 } 22}

投稿2020/12/30 11:20

phper.k

総合スコア3923

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

phper.k

2021/01/04 06:40

理解できたかどうかのコメントくらいしてくれてもいいと思うよな。 犬でさえ餌くれた人覚えてくれているというのに。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問