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

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

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

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

Q&A

解決済

2回答

8862閲覧

laravel Model の with() のリレーション先カラム名を変更して取得したい

takg

総合スコア125

Laravel 5

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

0グッド

0クリップ

投稿2019/01/21 14:36

編集2019/01/22 08:27

前提

以下のような構成のtable_a, table_bがあります。
table_atable_bは一対多の関係にあります。

  • table_a

id (int)
name (string)

  • table_b

id (int)
table_a_id (int)
name (string)

PHP

1namespace App\Models; 2use Illuminate\Database\Eloquent\Model; 3 4Class TableA extends Model 5{ 6 protected $table = 'table_a'; 7 public function b() 8 { 9 return $this->hasMany('App\Models\TableB'); 10 } 11}

PHP

1namespace App\Models; 2use Illuminate\Database\Eloquent\Model; 3 4Class TableB extends Model 5{ 6 protected $table = 'table_b'; 7 protected $hidden = ['table_a_id',]; 8 public function a() 9 { 10 return $this->belongsTo('App\Models\TableA'); 11 } 12}

知りたいこと

例えばtable_bから以下のようにModelを取得すると、

PHP

1$model = TableB::with('a')->find($id);

JSON

1{ 2 "id": 123, 3 "name": "hoge", 4 "a": { 5 "id": 456, 6 "name": "fuga" 7 } 8} 9

こんな感じになると思います。
ここで、

JSON

1{ 2 "id": 123, 3 "name": "hoge", 4 "a": { 5 "a_id": 456, 6 "a_name": "fuga" 7 } 8} 9

上記のように
id -> a_id
name -> a_name
と、withでリレーション先テーブルのカラム名を任意に変更して取得したいのですが、どなたかご存知ないでしょうか?

version

laravel 5.6

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

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

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

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

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

takg

2019/01/22 06:35

ありがとうございます。 マニュアル見てみたのですが、該当箇所が見つけられませんでした。。。
mix-peach

2019/01/22 06:53

「外部キー」とか、「ローカルキー」とか書いてあるあたりです! 最初から読まないと、似たような説明が省略されていることもあるので、気を付けてください。
takg

2019/01/22 07:02 編集

mix-peach様がおっしゃっているのは、ローカルキー/外部キーが`table名_id`になっていない場合などに明示的に指定する方法ではないでしょうか? SQLで書くと、 SELECT a.id as a_id, a.name as a_name FROM table_b AS b LEFT JOIN table_a as a ON b.a_id = a.id WHERE b.id = ?; における "a.name as a_name" の部分のように、 リレーション先の列名を任意のものに変更する方法が知りたいので、少し違う気がしたのですが。。。 もしも誤解であれば、申し訳ありません。
mix-peach

2019/01/22 07:29

はっ!質問を読み違えていたようで、申し訳ないです;; 正しい回答を、書いてくださっている方がいるので、主には、そちらを参考に! 他の方法も回答に書いてみますね(あんまりオススメしない方法ですが)
takg

2019/01/22 08:25

見直してみると、質問の文章が少しわかりにくかったです。 修正しておきます。 ご回答、ありがとうございました。
guest

回答2

0

crhgさんが書かれている方法が、正しいと思いますので、主にはそちらを参考にしてください。


他の方法のお話。

いつでも

json

1{ 2 "id": 123, 3 "name": "hoge", 4 "a": { 5 "a_id": 456, 6 "a_name": "fuga" 7 } 8}

の形で取得したくて、
つまり、「withするたびに、いちいちカスタマイズの指定を書くのはめんどくさい!」とかいう場合。

予め取得対象のカラムを指定するのと同じ要領で、TableBのModelのbelongsToに書いてしまう方法もあります。

php

1public function a() 2 { 3 return $this->belongsTo('App\Models\TableA') 4 ->select([ 5 'id as a_id', 6 'name as a_name', 7 'table_a_id'] 8 ); 9 }

こんな感じで、いけたはず・・
※ 外部キー「table_a_id」は、必ず含めてください。

コメントにも書いたのですが、この方法をオススメしないのは、

aの取得結果が、いつでもa_id,a_nameになってしまうので、「直感的にlaravelのwith」として使った場合に正しく参照できない可能性が高いことや、取得カラムを増やしたい場合に追記しなければいけないことなど、本来の利便性で失われる面があるからです。。。

「システム全体」で、このような共通の仕様(テーブルのリレーション先を見る時、カラム名はテーブル名が先頭に付く)があるのであれば、この方法でも特には問題ないかもですね。

投稿2019/01/22 07:47

mix-peach

総合スコア1910

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

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

takg

2019/01/22 08:24

ご回答ありがとうございます。 なるほど、belongTo()の時点で設定しておくこともできるのですね。 勉強になりました。
guest

0

ベストアンサー

マニュアルの「Eagerロードへの制約」のところに書いてあるクロージャでクエリビルダをもらっていろいろ操作を行うやり方は

もちろんEagerロード操作を更にカスタマイズするために、他のクエリビルダを呼び出すこともできます。

とあるように他のカスタマイズにも使えますので、selectを使って別名をつけることができます。

php

1 $model = TableB::with(['a' => function ($query) { 2 $query->select( 3 'id AS a_id', 4 'name AS a_name', 5 'table_a_id' // リレーションに使うカラムは必ず含める必要があります 6 ); 7 }])->find($id);

投稿2019/01/22 07:01

crhg

総合スコア1175

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

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

takg

2019/01/22 08:22

ご回答ありがとうございます。 教えていただいた方法で実現できました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問