2017-08-30 94 views
0

我订购了订单行,订单行有一个产品。如何在远程关系表Laravel上执行where查询?

我想只检索产品类型!= Partkit的orderLines。 所以我想查询产品表,其中类型!= Partkit。

我该怎么做? 订单查询:

$order = Order::with('orderLines.product')->where('user_id',Auth()->user()->id)->where('is_order','0')->first(); 

我想什么:

$order = Order::with('orderLines.product')->whereHas('orderLines.product', function($query) { 
      $query->where('type','!=', 'Partkit'); 
     })->where('user_id',Auth()->user()->id)->where('is_order','0')->first(); 

此八方通返回NULL,这不是我想要什么,是不正确的......

这是一个遥远的关系。

任何帮助表示赞赏

+0

您的订单关系如何?这应该是一个遥远的关系吗? ...编辑:看起来这是一个遥远的关系,你可能想在你的问题陈述中声明。 – Devon

+0

@Devon是的,这是一个遥远的关系。orderLines是订单和产品关系orderLines – Rubberduck1337106092

回答

0

我想出了这个代码做了什么,我想......

查询返回所有的,然后我手动忘记我不想orderLines。

不是最好的解决办法,但能够完成任务......

$order = Order::with('orderLines.product')->where('user_id',Auth()->user()->id)->where('is_order','0')->first(); 

foreach($order->orderLines as $key => $orderline) { 
    if(isset($orderline->product)){ 
     if($orderline->product->type == "Partkit") { 
      $order->orderLines->forget($key); 
     } 
    } 
} 
+0

您也可以使用收集方法来简化您的解决方案 – Desh901

+2

问题在于,您可能会拉动WAY多于所需的行数。 – ollieread

0

可以使用has()方法。

$order = Order::with('orderLines.product') 
      ->has('orderLines', function ($query) { 
       $query->has('product', function ($query) { 
        $query->where('type', '!=', 'Partkit'); 
       }); 
      }) 
      ->where('user_id',Auth()->user()->id) 
      ->where('is_order','0') 
      ->first(); 

这将选择所有的订单,其订单行,以及相应的产品,提供订单行有产品无类型Partkit

不幸的是,你不能做一个关系关系,所以你必须像他们一样嵌套它们。

希望有所帮助。

+0

这不起作用返回'strtolower()期望参数1是字符串,对象给定' – Rubberduck1337106092

+0

尝试'whereHas()'而不是'has()' – ollieread

+0

仍然没有运气,不是相同的错误,但doens't返回我想要的输出。 – Rubberduck1337106092

0

你应该试试这个:

$order = Order::with(['orderLines.product' => function($query) { 
      $query->where('type','!=', 'Partkit'); 
     }]) 
     ->where('user_id',Auth()->user()->id) 
     ->where('is_order','0') 
     ->first(); 

请检查我更新的回答,让我知道它的工作与否:

$order = Order::whereHas('orderLines.product', function($query) { 
      $query->where('type','!=', 'Partkit'); 
     })->where('user_id',Auth()->user()->id)->where('is_order','0')->first(); 

希望这对你的工作!

+0

返回所有的订单行,因为partkit存储在'product'中,而不是OrderLines。 – Rubberduck1337106092

+0

@JordyGroote让我检查它 –

+0

@JordyGroote请检查我的更新答案可能是它的帮助 –

0

我什么工作是以下查询:

Order::with(['orderLines' => function($q) { 

    $q->with('product')->whereHas('product', function($q2) { 
     $q2->where('products.type', '!=', 'Partkit'); 
    }); 

}])->where('user_id', \Auth()->user()->id) 
->where('is_order', '0')->get(); 

假设你的产品表称为products,否则变化$q2->where(...)声明中的表名称。

让我知道它是否有帮助。

+0

这将返回所有行,但只包含那些具有匹配产品的订单行。 – ollieread

+0

这是正确的,但这是我在脑海中唯一没有在模型类中使用连接和不需要的'$ with'属性的东西。 – Desh901