如何在一个Laravel DB函数中获取多个连接数据

时间:2017-06-23 11:32:27

标签: php laravel laravel-5 eloquent laravel-eloquent

更新3(已解决但未达到最佳状态)

有一种破解结果的方法:

public function loadRouteData($day, $week_nr, $year){
        $route_data = Facturatie_Invoice::with('customer', 'invoice_lines')
        ->whereHas('route_manager', function ($query) use ($week_nr, $year) {
            $query->where(['week_nr' => $week_nr,
                           'year' => $year]);
        })
        ->where('day', $day)
        ->get();

        foreach($route_data as $rd){
            for($i = 0; $i < count($rd->invoice_lines); $i++){
                $product = DB::table('facturatie_product')->where('id', $rd->invoice_lines[$i]->product_id)->first();
                $rd->invoice_lines[$i]->product = $product;
            }
        }
        return $route_data;
    }

我认为这不是最佳方式,所以如果你们中有人知道更好的方法,请告诉我。

我试过的细节和事情见下文。

我有以下ERD:

My ERD

现在我想要做的是 Facturatie_Route_Manager

Facturatie_Invoice
Facturatie_Customer
Facturatie_Invoice_Line
Facturatie_Product

现在,当我尝试以下操作时:

public function loadRouteData($day, $week_nr, $year){
    $route_data = DB::table('facturatie_route_manager')
    ->join('facturatie_invoice', 'facturatie_route_manager.invoice_id','=','facturatie_invoice.id')
    ->join('facturatie_customer', 'facturatie_invoice.customer_id','=','facturatie_customer.id')
    ->where(['facturatie_invoice.day' => $day,
             'facturatie_route_manager.week_nr' => $week_nr,
             'facturatie_route_manager.year' => $year])
    ->get();
    return $route_data;
}

我获得了路径管理器的重复记录,因为每个新的发票行都没有添加到同一记录中,而是创建了新记录。另外因为我没有得到理想的结果,我还没有在这里包括Facturatie_Product。

任何想法?我正在使用Laravel 5 +。

我尝试使用Facturatie_Route_Manager中的模型,但从模型Facturatie_Invoice id开始,似乎无法将Facturatie_Invoice_Line invoice_id引用到Facturatie_Route_Manager。如果可能的话,我宁愿不使用连接。

更新1

public function loadRouteData($day, $week_nr, $year){
        $route_data = Facturatie_Route_Manager::whereHas('invoice', function ($query) use ($day) {
            $query->where('day', $day);
        })
        ->where(['week_nr' => $week_nr,
                 'year' => $year])
        ->get();
        return $route_data;
    }

现在仍需要facturatie_invoice和facturatie_invoice_line以及facturatie_invoice_line和facturatie_product之间的链接。

模型Facturatie_Route_Manager

class Facturatie_Route_Manager extends Model
{
    protected $table = 'facturatie_route_manager';

    public function invoice(){
        return $this->hasOne('App\Facturatie_Invoice', 'id', 'invoice_id');
    }
}

更新2

从Facturatie_Invoice模型看起来更容易,因为它与Facturatie_Route_Manager有一对一的关系。此代码接近最终结果:

public function loadRouteData($day, $week_nr, $year){
        $route_data = Facturatie_Invoice::with('customer', 'invoice_lines')
        ->whereHas('route_manager', function ($query) use ($week_nr, $year) {
            $query->where(['week_nr' => $week_nr,
                           'year' => $year]);
        })
        ->where('day', $day)
        ->get();
        return $route_data;
    }

只需要Facturatie_Invoice_Line - product_idFacturatie_Product - id

之间的链接

模型Facturatie_Invoice

class Facturatie_Invoice extends Model
{
    protected $table = 'facturatie_invoice';

    public function customer()
    {
        return $this->hasOne('App\Facturatie_Customer', 'id', 'customer_id');
    }

    public function invoice_lines()
    {
        return $this->hasMany('App\Facturatie_Invoice_Line', 'invoice_id', 'id');
    }

    public function route_manager()
    {
        return $this->hasOne('App\Facturatie_Route_Manager', 'invoice_id', 'id');
    }
}

0 个答案:

没有答案