2016-04-02 34 views
0

好吧,所以我對口才和laravel新鮮(不框架tho),但我在這裏打了一堵牆。 我需要在不同的表上使用條件執行一些查詢,所以急切的加載(::with())是無用的,因爲它會創建多個查詢。laravel雄辯的加入和對象關係映射

好吧,讓我們使用連接。但是在這種情況下,Laravel/Eloquent似乎放棄了對象關係的概念,只是返回一個平坦的行。 由爲例:

假如我像

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

,然後循環如

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

有沒有更多的$oneInvoice->invoiceFieldName概念和$oneInvoice->contact->contactFieldName

我必須得到直接聯繫字段$oneInvoice->contactFieldName 最重要的是,相同的命名列wi會被過分糾纏(如idcreated_at)。

所以我的問題是:

我說得對假設沒有解決這一點,我必須手動定義字段中選擇,以避免同名overwritting像

發票::選擇(」 invoices.created_at as invoice.create,contacts.created_at as contact_create)

如果發生多個連接,它會使所有查詢構建過程變得漫長而複雜。但主要是,它只是破壞了框架應該帶來的所有模型關係工作?

有沒有更多的模型關係爲導向的解決方案來使用laravel或在雄辯的ORM?

回答

0

您可以使用Eloquent的關係來實現此目的,而不是執行此連接。

在您的發票模型這將是:

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

然後當然您聯繫模型裏面:

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

如果你想確保所有的查詢總是有這些積極的,那麼你想在你的模型中的以下內容:

protected $with = ['Invoice'] 

protected $with = ['Contact']; 

最後,與我們的關係很好defin ED,我們可以做到以下幾點:

$invoices = Invoice::all(); 

然後你就可以這樣做:

foreach($invoices as $invoice)[ 
    $invoice->contact->name; 
    $invoice->contact->phone; 
    //etc 
} 

這是我相信你正在尋找。

此外,您可以在Laravel的網站上的The Eloquent ORM Guide找到所有這些以及更多內容。

+0

嗨,感謝您的幫助, 但「帶」的方法在這裏不起作用。這將創建2個單獨的查詢。 首先獲取所有發票,第二個獲取發票的所有聯繫人。實際上,你不能用它來建立複雜的條件。 例如,您無法獲取聯繫人姓名以'A'開頭的第50到第75個發票 – Hairmenu