2016-04-02 19 views
0

私は雄弁とlaravel(フレームワークではない)に新しいですが、私はここで壁に当たっています。 異なるテーブルの条件でいくつかのクエリを実行する必要があるので、複数のクエリを作成するので、熱心な負荷(::with())は役に立たない。laravel堂々たる結合とオブジェクトとの関係のマッピング

いいえ、結合を使用します。しかし、その場合、Laravel/EloquentはObject-relationshipの概念を落として、単なる行を返すようです。 exempleによって :

私は

$allInvoicesQuery = Invoice::join('contacts', 'contacts.id', '=', 'invoices.contact_id')->get(); 

のようなものを設定し、$oneInvoice->invoiceFieldName$oneInvoice->contact->contactFieldName

のこれ以上の概念がありませんように

foreach ($allInvoicesQuery as $oneInvoice) { 
    ... working with fields 
} 

としてルーピング私が取得する必要があればフィールドに直接連絡する$oneInvoice->contactFieldName これに加えて、同じ名前の列wi (例えば、idまたはcreated_atのように)上書きされます。

は、だから私の質問は以下のとおりです。

は私が右、このの解決策がないと仮定すると、私は「(選択::

請求書のようなoverwritting同じ名前を避けるために選択して、手動でフィールドを定義する必要がありますアムinvoice.created_at as invoice.create、contacts.created_at as contact_create)

複数の結合の場合、すべてのクエリ構築プロセスが長く複雑になります。しかし、主に、それはフレームワークがもたらすものではないモデルの関係作業をすべて破棄するだけです。

laravelまたはEloquent ORM内で動作するModelリレーションシップ型ソリューションはありますか?

答えて

0

この結合を実行する代わりに、これを達成するためにEloquentの関係を使用できます。

ご請求書のモデルでは、次のようになります。

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

そしてもちろん、あなたの連絡先モデルの内側:

public function invoices(){ 
    return $this->hasMany('\App\Invoice'); 
} 

あなたはすべてのクエリは、常にこれらの活性を持っていることを確認したい場合は、あなたのモデルには次のようなものが必要です:

protected $with = ['Invoice'] 

protected $with = ['Contact']; 

最後に、

$invoices = Invoice::all(); 

をそしてあなたが行うことができます:エドは、私たちは次のことを行うことができます

私はあなたが探していると考えているものです
foreach($invoices as $invoice)[ 
    $invoice->contact->name; 
    $invoice->contact->phone; 
    //etc 
} 

さらに、LaravelのサイトでThe Eloquent ORM Guideでこれ以上の情報を見つけることができます。

+0

こんにちは、助けてくれてありがとう、 しかし、ここでは "with"アプローチはうまくいきません。これにより、2つの個別のクエリが作成されます。 最初にすべての請求書を取得し、2番目の請求書は請求書のすべての連絡先を取得します。 実際、そうで複雑な条件を構築することはできません。 たとえば、連絡先の名前が「A」で始まる50〜75番目の請求書を取得することはできません – Hairmenu

関連する問題