Help us understand the problem. What is going on with this article?

[Laravel]一対多の関係のJsonを出力する

More than 3 years have passed since last update.

私用で Laravelを触っていた時にふと気になって調査してました.
Laravelのバージョンは5.2になります.

Laravel で Jsonを返す方法

jsonの出力の仕方は色々な記事や公式ドキュメントを参照すると確認できるのですが,
リレーションを行なった時の記事はなかなか出てこないので,忘れた時のことを考えてメモ...

Jsonの出力方法

基本的には,ルーティングをした後に

public function getJson(){
    return Model::all()->toJson();
}

で,jsonが返されるかと思います.

リレーションを用いている時のJson出力

class Test extends Model{
    public function tests(){
        return $this->hasMany('App\Test1');
    }
}

class Test1 extends Model{
    public function test(){
        return $this->belongsTo('App\Test');
    }
}

となっている場合, Test1 に紐づく Test のデータは,

public function getJson(){
    return Test1::with(['test'])->get()->toJson();
}

みたいに書くと取得できます.

(2016/11/19 : よりシンプルな書き方を教えていただきましたので追記します.)
逆の場合には,

public function getJson(){
    return Test::with(['tests'])->get()->toJson();
}

でいけます.

少し手間がかかりますが,自分でkeyを指定することもできます.

public function getJson(){
    $test_all = Test::all();
    foreach($test_all as $test){
        $test['testA'] = $test->tests()->get();
    }
    return $test_all->toJson();
}

またもっと深いネストで実現したい場合には,

public function getJson(){
    $test_all = Test::all();
    foreach($test_all as $test){
        $test['testA'] = $test->tests()->get();

        $test['testA']['testB'] = $test->tests()->get();

        $test['testA']['testB']['testC'] = $test->tests()->get();
    }
    return $test_all->toJson();
}

みたいにやるといけると思います.


追記

class SampleA extends Model{
    public function c_samples(){
        return $this->hasMany('App\SampleB');
    }
}

class SampleB extends Model{
    public function c_samples(){
        return $this->hasMany('App\SampleC');
    }
}

class SampleC extends Model{
    public function b_sample(){
        return $this->belongsTo('App\SampleB');
    }

    public function a_sample(){
        return $this->belongsTo('App\SampleA');
    }
}

こんな感じのモデルの関係で,SampleBのJson出力を行う際,「SampleCに紐づくSampleAのデータも欲しい!」なんて時には,

public function getJson(){
    return SampleB::with(['c_samples.a_sample'])->get()->toJson();
}

って感じで, ドットで追加すればいけます.
調査を行っていく度にLaravelの優秀さに驚く・・

hiyoko3
A Software developer in Tokyo.
https://hiyoko3.github.io/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away