首页 文章

laravel Eloquent join和Object-relationship mapping

提问于
浏览
0

好吧,所以我有点狡猾和laravel(不是框架),但我在这里碰到了一堵墙 . 我需要在不同的表上执行一些条件查询,因此急切加载( ::with() )是无用的,因为它会创建多个查询 .

好吧,让我们使用连接 . 但在这种情况下,似乎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 直接获取联系人字段 . 最重要的是,相同的命名列将被覆盖(例如 idcreated_at ) .

所以我的问题是:

我是正确的假设没有解决方案,我必须手动定义选择中的字段,以避免相同的名称覆盖像

Invoice :: select('invoices.created_at as invoice.create,contacts.created_at as contact_create)

在多个连接的情况下,它使得所有查询构建过程冗长且复杂 . 但主要是,它只是破坏了框架应该带来的所有模型关系工作?

是否有更多的模型关系导向解决方案与laravel或Eloquent ORM一起工作?

1 回答

  • 0

    您可以使用Eloquent的关系来实现此目的,而不是执行此连接 .

    在您的发票模型中,它将是:

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

    然后当然在您的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找到所有这些以及更多内容 .

相关问题