Laravel Eloquent - 筛选关系的关系

4
这是我尝试执行的查询:
$products = Product::with(['cross_selling.product_related' => 
   fn($query) => $query->where('status_id', '=', '2')])
  ->where('status_id',2)
  ->get();

我得到了这个结果:

enter image description here

在交叉销售中,我仍然得到ID:12,它没有任何产品相关的内容。如果产品相关为空,我需要一些帮助来使查询不给我该项。谢谢。

1
$this->filteredSql? - Michael Mano
抱歉,我的错,已经修改了!谢谢提醒。 - Fryla- Cristian Marucci
请发布模型关系和方案。 - parth
3个回答

3
首先只获取具有任何相关产品的交叉销售,然后获取相关产品。在cross_selling上使用whereHas条件。
$products = Product::with(['cross_selling' => function($qry){
    $qry->whereHas('product_related', function ($q) {
        $q->where('status_id', 2);
    });
    }, 'cross_selling.product_related' =>
    fn($query) => $query->where('status_id', '=', '2')])
    ->where('status_id',2)
    ->get();

1
非常感谢 @Karnal-YK,这是完美的解决方案! - Fryla- Cristian Marucci
嗨@Fryla-CristianMarucci,我是stackoverflow的新手。它显示有50个赏金点,但我还没有收到。你知道这方面的任何信息吗? - Karnal-YK
@Karnal-YK https://stackoverflow.com/help/bounty - Nicklas Kevin Frank
从今天起两天后,您将收到它! - Fryla- Cristian Marucci

1

试试这个

$products = Product::with(['cross_selling.product_related' => 
   fn($query) => $query->where('status_id', '=', '2')])
  ->has('cross_selling.product_related')
  ->where('status_id',2)
  ->get();

不起作用,结果相同。 - Fryla- Cristian Marucci

1
如果您不想与没有相关产品的交叉销售产品,请添加。
->whereHas('product_related')

基本上是说:只获取具有“product_related”的交叉销售。

为了正确执行此操作,您可以:

$callback = fn($query) => $query->where('status_id', 2);
$products = Product::whereHas('cross_selling.product_related', $callback)
->with(['cross_selling.product_related' => $callback])
->where('status_id',2)->get();

现在回调函数被应用于whereHas()with(),同时您可以使用$callback传递其他约束条件。

不起作用,在这里也是相同的结果。无论如何,谢谢。 - Fryla- Cristian Marucci

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接