2016-07-26 11 views
1

私はEloquentを利用して、データベースから一種の結果コレクションを取得しようとしています。Eloquent hasMany with Laravel 5.2でもっと深く進む方法は?

は私がas_inspectionsと呼ばれるテーブル、テーブルと呼ばas_green_areasとテーブルと呼ばれるas_assets

各検査は、単一の緑豊かなエリアを持ち、それぞれの緑のエリアには多くの資産を持っています。

私は検査をフェッチするとき、私はこのような何かを実行します。

検査モデル

namespace App; 

use Illuminate\Database\Eloquent\Model; 

class Inspection extends Model 
{ 
    protected $table = 'as_inspections'; 

    public function greenAreas() 
    { 
     return $this->hasOne('App\GreenArea', 'id'); 
    } 
} 

GreenAreaモデル

namespace App; 

use Illuminate\Database\Eloquent\Model; 

class GreenArea extends Model 
{ 
    protected $table = 'as_green_areas'; 
} 

ルート今、私が好きな
Route::get('inspections', ['middleware' => 'cors', function() 
{ 
    $isp = new \App\Inspection(); 
    return $isp 
     ->with('greenAreas') 
     ->get(); 
}]); 

dにOこのような何か:コメントに書かれたよう

Route::get('inspections', ['middleware' => 'cors', function() 
    { 
     $isp = new \App\Inspection(); 
     return $isp 
      ->with('greenAreas') 
      ->with('assets') // where each green area has its own set of assets 
      ->get(); 
    }]); 

、私はその緑豊かなエリアのためにすべての資産を取得したいし、その検査のためのすべての緑地と思います。

どうすればいいですか? ありがとう!

答えて

2

ファーズは次のように定義されるであろう、あなたのテーブルに正しいものとの関係関数の外部キーを交換することを確認し、

namespace App; //model class for inspection 

use Illuminate\Database\Eloquent\Model; 

class Inspection extends Model 
{ 
    protected $table = 'as_inspections'; 

    public function greenArea() 
    { 
     return $this->belongsTo('App\GreenArea', 'greenareaid','id'); 
    } 
} 


namespace App; //model for green area 

use Illuminate\Database\Eloquent\Model; 

class GreenArea extends Model 
{ 
    protected $table = 'as_green_areas'; 

    public function inspection() 
    { 
     return $this->hasOne('App\Inspection', 'greenareaid','id'); 
    } 

    public function assets() 
    { 
     return $this->hasMany('App\Asset', 'greenareaid','id'); 
    } 
} 

namespace App; //model for asset 

use Illuminate\Database\Eloquent\Model; 

class Asset extends Model 
{ 
    protected $table = 'as_assets'; 
    public function greenArea() 
    { 
     return $this->belongsTo('App\GreenArea', 'greenareaid','id'); 
    } 

} 

、あなたはの熱心なロードを使用することができます簡単にそれはAJAX要求、モバイルだ..あなたが方法を見つけるために、検査モデルの主キーを渡し、それ

Inspection:find(1)->with('greenArea.assets'); 
+0

こんにちは!この答えをありがとう!私は現在、それを実装しようとしています。ただ一つの質問。 greenareaidされていますか? as_inspectionsテーブルではgreen_area_fkという名前のfkを持っていますが、inspectionidをgreen_area_fkと交換するか、IDを検査テーブルの主キーとしておく必要がありますか?私はこれらのメソッドのオプションパラメータについてはかなり混乱しています... – Caius

+0

それは働いた!ありがとう! hasManyなどのような雄弁なメソッドのオプションパラメータについてもっと学ぶために私にいくつかのリソースをリンクする時間があれば、それは素晴らしいことでしょう! – Caius

+1

上記の私の更新されたコードを参照してください、私はあなたのような場合は、あなたが検査テーブルに外部キーを保持するように、あなたは緑の領域のための1つの検査を持っているので、belongsToメソッドが定義されているあなたの外来キーがどこに住んでいますか... ベストチュートリアルはLaravel.comです。ドキュメント、私は1年以上経って以来、それを参照しており、ERPシステムを完成しています.... –

0
Inspection::find($id)->greenAreas()->assets()->all(); 

これは、Inspection $ idによって検査されたgreenAreasのすべてのアセットを取得します。

お探しのクエリが不明です。

すべてのモデルクラスと関係の
+0

のために緑豊かなエリアと関連する資産をつかむ怒鳴るの例のように、関連するモデルをもたらすために雄弁アプリは、そのAPIに関する一連の情報を必要としますpections。そしてそれはどんなIDも渡していません。だから私はすべての検査を取得する必要があり、検査ごとにgreen_areas関連、および各green_areaすべての資産。私はこの方法を知ることさえできません:/ – Caius

+0

'Inspection :: all() - > with( 'greenArea.assets');'動くはずです – Vuldo

+1

Inspection :: find($ id) - > greenAreas() - >最初の()、これは正しくない、最初に()と呼ばれる必要はありません関係がhasoneとして定義されている場合 –