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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Laravel

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

1回答

708閲覧

Laravel 5.7にてEagerLoadで取得した子テーブル情報のみを一覧取得したい

newmog2004

総合スコア12

Laravel

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

0クリップ

投稿2020/03/08 01:19

Laravel 5.7でコンテンツ配信サービスの開発を行っており、Relation関係で困っているのでご相談させてください。

・Userが複数のLicenseを持つ(1:n関係)
・Licenseは複数のContentを持つ(n:n関係)

という要件で、モデルにリレーションメソッドを作成しました。

PHP

1class User extends Model { 2 /** 3 * このユーザーが持つライセンス取得を行う 4 */ 5 public function licenses() { 6 return $this->hasMany(Licenses::class); 7 } 8} 9 10class Lincese extends Model { 11 /** 12 * このライセンスに割り当たっているコンテンツ取得を行う 13 */ 14 public function contents() { 15 return $this->belongsToMany(Content::class); 16 } 17 18 /** 19 * 有効なライセンスのフィルタリングを行う 20 */ 21 public function scopeActive($query) { 22 return $query->where('active', true); 23 } 24} 25 26class Content extends Model { 27 /** 28 * 公開済みコンテンツのフィルタリングを行う 29 */ 30 public function scopeAvailable($query) { 31 return $query->where('available', true); 32 } 33}

上記の例において、ログイン中のユーザーが参照できるコンテンツ一覧を表示する画面を作る際、
EagerLoadingで視聴可能なContentの一覧を取得したいと思いました。

PHP

1class User extends Model { 2 /****** 省略 *****/ 3 4 /** 5 * この利用者の視聴可能なコンテンツ一覧の取得(をしたい) 6 */ 7 pubic function viewableContents() { 8 return $this->licenses() 9 ->active() 10 ->with(['content'=>function($query){ 11 $query->available(); 12 }]); 13 } 14} 15 16class MainController extends Controller { 17 /****** 省略 *****/ 18 19 /** 20 * ログイン中の利用者の視聴可能なコンテンツ一覧を表示 21 */ 22 public function showLibrary() { 23 $contents = Auth::user()->viewableContents() 24 ->orderByDesc('contents.created_at'); 25 return view('user.library', compact($contents)); 26 } 27}

上記のUser#viewableContents()を実行すると「視聴可能なContentを持ち」、「有効なLicense」の一覧は取得できるのですが、Content の一覧にはならず、ライセンスの一覧が取得されてしまいます。

呼び出し元のController側で、viewableContents()の結果を基にLicenseの結果をループで回しながら、Contentの一覧を作成してもいいのですが、並び替えやページングの処理を自分で実装しなければならなくなってしまいます。
MainController#showLibrary() で取得した$contentsに対して、paginate等も実行したいです。

上記のように、EagerLoadingで取得してきた子テーブルのデータのみを一覧取得するようなクエリビルダの書き方があれば教えて欲しいです。

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

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

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

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

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

guest

回答1

0

hasManyThrough のリレーションは使えないでしょうか。
User::licenses()hasMany(License::class) と書いているので License モデルが返ってくるのはドキュメントに記載された通りの動作だと思います。
以下のような方法で License モデルを中間テーブルにして Content モデルが取得できると思います。

php

1User::availableContents() { 2 // 動かしてないので適当ですがこんな感じで。 3 return $this->hasManyThrough(Content::class, License::class); 4}

そもそも論なのですが Content が欲しいならそこにメソッド作る方が複雑にならないと思います。

Content::getAvailableContents($user, $license) こんな感じで。

投稿2020/03/08 03:57

kodai

総合スコア759

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

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

mpyw

2020/04/19 16:20

> 並び替えやページングの処理を自分で実装しなければならなくなってしまいます。 ページネーションが入るならこれ1択ですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問