前提
以下のような構成のtable_a
, table_b
があります。
table_a
とtable_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
マニュアルに書いてありますよ!
https://readouble.com/laravel/5.6/ja/eloquent-relationships.html
読んで試して、それでも分からない点があれば、改めてこの質問へ追記をしたらいいと思います^^
ありがとうございます。
マニュアル見てみたのですが、該当箇所が見つけられませんでした。。。
「外部キー」とか、「ローカルキー」とか書いてあるあたりです!
最初から読まないと、似たような説明が省略されていることもあるので、気を付けてください。
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" の部分のように、
リレーション先の列名を任意のものに変更する方法が知りたいので、少し違う気がしたのですが。。。
もしも誤解であれば、申し訳ありません。
はっ!質問を読み違えていたようで、申し訳ないです;;
正しい回答を、書いてくださっている方がいるので、主には、そちらを参考に!
他の方法も回答に書いてみますね(あんまりオススメしない方法ですが)
見直してみると、質問の文章が少しわかりにくかったです。
修正しておきます。
ご回答、ありがとうございました。

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