2016-04-02 35 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