更新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:
现在我想要做的是 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_id
和Facturatie_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');
}
}